点の集まりからパターンマッチングしてくれるMATLABとC++用のライブラリLIBICPを導入する
卒論のために点パターンマッチングを行う必要がありました。
時間がないので手頃なライブラリを探していたところ、LIBICP
というものを見つけました。
Andreas Geiger
SVD-baseな点パターンマッチングを行ってくれるようです。よくわかりませんが。
C++で書かれている上、MATLABで使用する方法やデモも紹介してくれていました。
もともとMATLABで動かすつもりだったのでありがたいところです。
Homebrew
を使ってMac(OSは10.9)に導入します。
今回やることは以下のとおりです。
- Boostのインストール
- cmakeのインストール
- デモを動かしてみる
- MATLABでデモを動かしてみる
1. Boostのインストール
Boostという、C++の黒魔術書みたいなライブラリを導入する必要があります。 この時のバージョンは1.55でした。
Homebrew
を使ってインストールします。
Homebrew
を持っていない方は別途検索してインストールしてください。
brew update
brew install boost
↓こんな結果が出てくれば成功です
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/boost-1.55. ######################################################################## 100.0% ==> Pouring boost-1.55.0.mavericks.bottle.1.tar.gz /usr/local/Cellar/boost/1.55.0: 10040 files, 512M
2. cmakeのインストール
デモを見たい場合はcmakeが必要らしいので、導入していきます。
この工程がなくてもライブラリを使用することは可能だと思うので、飛ばしてもらっても大丈夫です。
brew install cmake
3. デモを動かしてみる
先ほど導入したcmakeを使ってコンパイルし、デモを動かしてみます。
cmake .
↓以下のような結果が出れば成功です。
-- Configuring done -- Generating done -- Build files have been written to: /Users/[ユーザー名]/Downloads/libicp
続いてmake
を行います。
make
↓以下のような結果が出れば成功です。
Scanning dependencies of target icp [ 16%] Building CXX object CMakeFiles/icp.dir/src/demo.cpp.o [ 33%] Building CXX object CMakeFiles/icp.dir/src/icp.cpp.o [ 50%] Building CXX object CMakeFiles/icp.dir/src/icpPointToPlane.cpp.o [ 66%] Building CXX object CMakeFiles/icp.dir/src/icpPointToPoint.cpp.o [ 83%] Building CXX object CMakeFiles/icp.dir/src/kdtree.cpp.o [100%] Building CXX object CMakeFiles/icp.dir/src/matrix.cpp.o /Users/[ユーザー名]/Downloads/libicp/src/matrix.cpp:418:1: warning: control may reach end of non-void function [-Wreturn-type] } ^ 1 warning generated. Linking CXX executable icp [100%] Built target icp
なんかwarning出てますけど気にしません。
成功していればicp
というデモファイルができているので、実行します。
./icp
すると、こんな感じの出力がありました。
Creating model with 10000 points ... Creating template by shifting model by (1,1,1) ... Running ICP (point-to-plane, no outliers) Transformation results: R: 1.0000000 0.0000000 0.0000000 -0.0000000 1.0000000 0.0000000 -0.0000000 -0.0000000 1.0000000 t: 1.0000000 1.0000000 1.0000000
何をしているのかよくわかりませんが、成功したんでしょう。
4. MATLABでデモを動かしてみる
まずはC++ライブラリをMATLABで使えるように、mex
をする必要があります。
が、このままではboostのパスが通っていないのでmexに失敗します。そのため、make.mを少し書き換える必要があります。
MTALABを開いて、matlabフォルダに移動し、make.m
を開きます。
↓これを
% make.m mex('icpMex.cpp','../src/icp.cpp','../src/icpPointToPoint.cpp',... '../src/icpPointToPlane.cpp','../src/kdtree.cpp',... '../src/matrix.cpp','-I../src'); mex('sparsifyMex.cpp','../src/kdtree.cpp','-I../src');
↓こう書き換えます
% make.m mex('icpMex.cpp','../src/icp.cpp','../src/icpPointToPoint.cpp',... '../src/icpPointToPlane.cpp','../src/kdtree.cpp',... '../src/matrix.cpp','-I../src' , '-I/usr/local/include'); mex('sparsifyMex.cpp','../src/kdtree.cpp','-I../src' , '-I/usr/local/include');
その後、make.mを実行します
make
Xcodeのバージョンが5を超えていると、次のようなエラーが出てきました。
xcodebuild: error: SDK "macosx10.7" cannot be located. xcrun: error: unable to find utility "clang++", not a developer tool or in PATH mex: compile of ' "icpMex.cpp"' failed.
これは、mexの方法を変更することで解決できるようです。
Can I use Xcode 5 as my C or C++ compiler in MATLAB 8.1 (R2013a) or MATLAB 8.2 (R2013b)? - MATLAB Answers - MATLAB Central
mexをOS10.8のSDKで行うように設定してから、もう一度make.mを実行します。
make
↓このようなメッセージが表示されました。
icpMex.cpp:17:50: warning: '&&' within '||' [-Wlogical-op-parentheses] ...|| mxGetM(prhs[0])!=2 && mxGetM(prhs[0])!=3) ~~ ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~ icpMex.cpp:17:50: note: place parentheses around the '&&' expression to silence this warning ...mxGetM(prhs[0])!=2 && mxGetM(prhs[0])!=3) ^ ( ) icpMex.cpp:19:50: warning: '&&' within '||' [-Wlogical-op-parentheses] ...|| mxGetM(prhs[1])!=2 && mxGetM(prhs[1])!=3) ~~ ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~ icpMex.cpp:19:50: note: place parentheses around the '&&' expression to silence this warning ...mxGetM(prhs[1])!=2 && mxGetM(prhs[1])!=3) ^ ( ) 2 warnings generated. ../src/matrix.cpp:418:1: warning: control may reach end of non-void function [-Wreturn-type] } ^ 1 warning generated.
warningは出ましたが、mexに成功しました。
成功しているかどうかは、MATLAB用のデモを実行すればわかります。
demo_2d.m
demo_3d.m
以上で導入は完了です。配布されている方の説明がわかりやすく、とても簡単に導入することが出来ました。
また使ってみた感想でも書こうかと思います。