Rob Hess氏のSIFT特徴量抽出モジュールつかってみる

OpenHRP3動かない(余談)

面白そうだし、AISTのOpenHRP3をやってみることにしました。もちろんWindowsで。
マニュアルどおりにインストールして、サンプルを実行しようとしましたが、"Failed to initialize DynamicsSimulator."と言われてしまいました。調べてみようと思いましたが、エラーメッセージで検索してもozlogさんしか引っかかりません。ozlogさんも解決できてないし。うーん。インストールマニュアルを読み直しましたが、簡潔すぎてヒントがありません。うーん。

本題

物体認識は以前から興味があったので、検索して引っかかった資料を片っ端から読んでみました。
中部大 藤吉先生物体認識に関する論文静岡大 山下先生単眼カメラによるSLAMに関する論文(PDF)は素人にも読みやすくとても参考になりました。
OpenCVをいじり倒してみましたが(膨大なライブラリなのでそれも難しいですが)、簡単に物体認識ができるライブラリはないので、自分で勉強してOpenCVで実装できたらいいなーとか気軽に考えていました。藤吉先生のSIFTに関する論文は難解ながらとても面白い内容です。
しかし、これをコードに落とすのはやはり難しい作業で早々に挫折していました。
ですが、最近SIFTの実装コードが公開されていることを知りました。米オレゴンRob Hess氏のページで配布しているので、早速ダウンロードです。WindowsLinuxもあるので便利です。いつもどおり楽するためにWindows向けのZIPをもらいました。
解凍するとソリューションとソースが入っています。Momma'sWiki曰く、siftFeatは抽出機能、matchは照会・検出機能、dspFeatは特徴の出力機能だそうです。ソリューションも完成しているのでビルドすれば使えます。

siftFeatをつかってみる

私の場合はリンクで"cvd.libがない"と怒られるのですが、プロジェクトのプロパティから確認すると

cvd.lib highguid.lib cvauxd.lib cxcored.lib

参照しているlibファイルが違うっぽいので、自分が使っているlibファイルの表記にすげかえてみたら使えました。

cvcam.lib highgui.lib cxts.lib cv.lib cxcore.lib ml.lib cvaux.lib cvhaartraining.lib videoInput.lib

とりあえず実行してみるとこんな感じ。

ソースを見るとsiftFeat.cにはmain()しかなくてそこからsift.cの関数を呼び出しているので、main()内でカメラからループでキャプチャーをとるように修正して実行してみるとこんな感じ。

やたら重いです。複雑な演算をやっているから当然ですが。

match

こちらもさっきと同じようにビルドすれば。。。

1>xform.obj : error LNK2019: 未解決の外部シンボル _gsl_rng_free が関数 _ransac_xform で参照されました。
1>xform.obj : error LNK2019: 未解決の外部シンボル _gsl_rng_set が関数 _ransac_xform で参照されました。
1>xform.obj : error LNK2019: 未解決の外部シンボル _gsl_rng_alloc が関数 _ransac_xform で参照されました。
1>xform.obj : error LNK2001: 外部シンボル "_gsl_rng_mt19937" は未解決です。
1>xform.obj : error LNK2019: 未解決の外部シンボル _gsl_sf_lnchoose が関数 _calc_min_inliers で参照されました。
1>xform.obj : error LNK2019: 未解決の外部シンボル _gsl_rng_uniform_int が関数 _draw_ransac_sample で参照されました。

あれれ。何でしょう。xform.cのransac_xform()という関数からGSLの関数を呼び出していることに問題があるようです。gsl_rng_free()やgsl_rng_set()といった関数はインクルードしているgsl_rng.hというヘッダで定義されているのでコンパイルは通っているようです。リンクエラーということは実装コードが見つからないという意味だと思われます。
上記のMomma'sWikiのGSLインストールの仕方では「ソースをダウンロードして展開するとlibファイルがあるからそれをソリューションディレクトリに移動して..」みたいな手順に読めたのですが、実際gsl-1.8-src.zipを解凍してみると「VC8」とかいうフォルダはなくて、gsl-1.8.exeからウィザードでインストールして良しとしてしまったんですが、それが問題だったかな。ちゃんとドキュメント読めばいいんでしょうけど、なにしろEnglishなのであがいてみます。
こういうライブラリを呼ぶときは
(1) VCの「ツール - オプション - VC++ディレクトリ」でライブラリファイルのあるディレクトリとインクルードファイルのあるディレクトリを指定する
(2) ソリューションの「プロパティ - 構成プロパティ - リンカ - 入力 - 追加の依存ファイル」でlibファイルを指定する
というのが私がいつもやっている手順です。これにそって試してみます。

(1) インクルードディレクトリに"C:\Program Files\GnuWin32\include"を、ライブラリディレクトリにC:\Program Files\GnuWin32\libを指定。
(2) ライブラリファイルを。。

libgsl.def
libgsl.dll.a
libgsl.a
libgslcblas.def
libgslcblas.dll.a
libgslcblas.a

ってC:\Program Files\GnuWin32\libの中を見るとlibファイルもdllもありません。しかし、どうも胡散臭いファイルがあります。.aファイルの拡張子を.lib、.dll.aファイルの拡張子を.dllに変更してみます。

libgsl.def
libgsl.dll
libgsl.lib
libgslcblas.def
libgslcblas.dll
libgslcblas.lib

そしてコンパイルすると。。一応エラーはなくなりました。実行したら大変なことになるかもと思いつつ実行すると。
やったー。成功。

1時間くらい格闘。。。英語読んだ方が早かったか。