読者です 読者をやめる 読者になる 読者になる

Kinectのお勉強


今回利用したサンプルは「NiUserTracker」。
このサンプルは、人を検出して、キャリブレーションポーズをすると、スケルトンを表示してくれるというステキな物。

もともと作ろうとしているものが、着せ替えアプリとか子供が食いつきそうな物なので、このサンプルの勉強は必須です。

普通にOpenNIをインストールすれば、サンプルのコンパイルもされて、サンプルを実行することができるのだが、Xcodeを使ってプログラミングしたいから、このサンプルも前回のようにXcodeコンパイル>実行してみます。


必要なファイルのコピーや、フレームワークを追加すればサクっと動くはずが、こんなエラーが吐かれてコンパイルが通らない。。

Undefined symbols for architecture x86_64:
"_eglGetError", referenced from:
TestEGLError(char*) in opengles.o
__ZL9setup_egliPvPiPP14_KEGL_SURFACE_PP14_KEGL_CONTEXT_ in opengles.o
"_eglGetDisplay", referenced from:
__ZL9setup_egliPvPiPP14_KEGL_SURFACE_PP14_KEGL_CONTEXT_ in opengles.o
"_eglInitialize", referenced from:
__ZL9setup_egliPvPiPP14_KEGL_SURFACE_PP14_KEGL_CONTEXT_ in opengles.o
"_eglChooseConfig", referenced from:
__ZL9setup_egliPvPiPP14_KEGL_SURFACE_PP14_KEGL_CONTEXT_ in opengles.o
"_eglTerminate", referenced from:
__ZL9setup_egliPvPiPP14_KEGL_SURFACE_PP14_KEGL_CONTEXT_ in opengles.o
opengles_shutdown(int, _KEGL_SURFACE_*, _KEGL_CONTEXT_*) in opengles.o
"_eglCreateWindowSurface", referenced from:
__ZL9setup_egliPvPiPP14_KEGL_SURFACE_PP14_KEGL_CONTEXT_ in opengles.o
"_eglCreateContext", referenced from:
__ZL9setup_egliPvPiPP14_KEGL_SURFACE_PP14_KEGL_CONTEXT_ in opengles.o
"_eglMakeCurrent", referenced from:
__ZL9setup_egliPvPiPP14_KEGL_SURFACE_PP14_KEGL_CONTEXT_ in opengles.o
opengles_shutdown(int, _KEGL_SURFACE_*, _KEGL_CONTEXT_*) in opengles.o
"_eglDestroyContext", referenced from:
opengles_shutdown(int, _KEGL_SURFACE_*, _KEGL_CONTEXT_*) in opengles.o
"_eglDestroySurface", referenced from:
opengles_shutdown(int, _KEGL_SURFACE_*, _KEGL_CONTEXT_*) in opengles.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

OpenGL ESで定義されている関数が無いから怒られているわけだが、LionのコマンドラインプロジェクトなのでOpenGL ESのフレームワークが追加ができない。
iOS用のプロジェクトであれば、OpenGL ESのフレームワークを指定することができる)
そもそも、ESはEmbedded Systems向けのものなんだから、Lion向けには指定できないよね?きっと。
ググッても似たような現象が見つからず、しばらく悩んでしまった。

OpenNIのインストール時に作成されたサンプルは動いているんだから、コンパイル時の指定がなにか間違えているのは間違い。
元のサンプルのmakeファイルを覗いてみたら、あっさり解決した。

今回のサンプルでは、Xcode
・opengles.cpp
・SceneDrawer.cpp
・main.cpp
の3つのソースファイルを追加したのですが、OpenGL ESが無い環境では「opengles.cpp」をコンパイルしちゃダメみたい。

Build Phase の Compile Soruces に足されていた、opengles.cppを削除したら、無事コンパイル成功!

実際にアプリを実行してみると、、

Open failed: File not found!

とか表示された。
あ〜、SamplesConfig.xml のパスが合っていないからなのだが、出力先のディレクトリから相対パスを毎回書くのは面倒くさいので、ビルド時にこのファイルも出力先にコピーするようにすると、ややこしくなくて楽である。

この指定は、Build Phase の最後にアクションを足してあげればOKです。

「Add Build Phase」をクリックするとメニューが表示されるので、「Copy Files」を選びます。
アクションが追加されるので、DestinationにProducts Directoryを指定して、コピーしたいファイルを追加します。

これで、ビルド時にコピーされるようになるので、main.cppでは、

#define SAMPLE_XML_PATH "./SamplesConfig.xml"

と書いておけばエラーが出なくなります。


サンプルを実行した結果はこちら。

まだトラッキングされていない状態。

キャリブレーションのポーズを取る

トラッキンが開始され、スケルトンが表示される。


一連の動画