開発のヒホ

iOSとかAndroidとかのアプリを開発するのに四苦八苦するブログ

点の集まりからパターンマッチングしてくれるMATLABとC++用のライブラリLIBICPを導入する

 卒論のために点パターンマッチングを行う必要がありました。
 時間がないので手頃なライブラリを探していたところ、LIBICPというものを見つけました。
 Andreas Geiger

 SVD-baseな点パターンマッチングを行ってくれるようです。よくわかりませんが。
 C++で書かれている上、MATLABで使用する方法やデモも紹介してくれていました。
 もともとMATLABで動かすつもりだったのでありがたいところです。

 Homebrewを使ってMac(OSは10.9)に導入します。
 今回やることは以下のとおりです。

  1. Boostのインストール
  2. cmakeのインストール
  3. デモを動かしてみる
  4. 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

f:id:hihokaruta:20140103192109p:plain

demo_3d.m

f:id:hihokaruta:20140103192113p:plain

 以上で導入は完了です。配布されている方の説明がわかりやすく、とても簡単に導入することが出来ました。
 また使ってみた感想でも書こうかと思います。