nikuyoshiのブログ

記事の内容については個人の見解であり、所属企業の意見を代表するものではありません

Xcode4 + MacOSX 10.7 でOpenNIのサンプルをビルドする

キネクト ハッカーズマニュアル

キネクト ハッカーズマニュアル


上記の本とネットに載っている情報を参考にしながら実行しました。それにしてもXcode3に比べてXcode4のリファレンスが少ない。
macでOpenNIのサンプルをビルドする - MshrKatoの日記
OpenNI and Xcode 4 « Marcelo's Blog
Getting up and running with OpenNI and NITE on a Mac - davidbliss

Xcode, OpenNI, NITE, SensorKinectのインストールに関してはこちらを参考にして下さい。
MacでKinectを動かしてみた。 - nikuyoshiの日記

  • プロジェクトの作成

Command Line Tool > C++プロジェクトを選択して下さい。
f:id:nikuyoshi:20111206173245p:image

  • 次のパスを、ヘッダ検索パスに追加します。

/usr/include/nite
/usr/include/ni
f:id:nikuyoshi:20111206173243p:image

  • 他のリンカフラグに、次のパスを追加します。

/usr/lib/libXnVNite_1_5_0.dylib
/usr/lib/libOpenNI.dylib
f:id:nikuyoshi:20111206173244p:image

main.cppに次のコードを記述して、Kinectを接続した状態で実行します。

main.cpp

#include <iostream>
#include <stdexcept>
#include <XnCppWrapper.h>
#include <XnVSessionManager.h>
//設定ファイルのパス 自分の環境にあわせて書き換えて下さい。
const char* CONFIG_XML_PATH = "/Users/nikuyoshi/Documents/program/MotionCapture_1_0_0/SamplesConfig.xml";
int main (int argc, const char * argv[])
{
    try {       
        xn::Context context;
        XnStatus rc = context.InitFromXmlFile(CONFIG_XML_PATH);
        if (rc != XN_STATUS_OK) {
            throw std::runtime_error(::xnGetStatusString(rc));
        }
        XnVSessionManager sessionManager;
        rc = sessionManager.Initialize(&context, "Wave,Click", "RaiseHand");
        if (rc != XN_STATUS_OK) {
            throw std::runtime_error(::xnGetStatusString(rc));
        }
        std::cout << "Success" << std::endl;
    } catch (std::exception& ex) {
        std::cout << ex.what() << std::endl;
    }
    return 0;   
}

SamplesConfig.xml

<OpenNI>
	<Licenses>
		<License vendor="PrimeSense" key="0KOIk2JeIBYClPWVnMoRKn5cdY4="/>
	</Licenses>
	<Log writeToConsole="false" writeToFile="false">
		<!-- 0 - Verbose, 1 - Info, 2 - Warning, 3 - Error (default) -->
		<LogLevel value="3"/>
		<Masks>
			<Mask name="ALL" on="true"/>
		</Masks>
		<Dumps>
		</Dumps>
	</Log>
	<ProductionNodes>
		<Node type="Image" name="Image1">
			<Configuration>
				<MapOutputMode xRes="640" yRes="480" FPS="30"/>
			</Configuration>
		</Node>
		<Node type="Depth" name="Depth1">
			<Configuration>
				<MapOutputMode xRes="640" yRes="480" FPS="30"/>
			</Configuration>
		</Node>
		<Node type="User" />
		<Node type="Hands" />
		<Node type="Gesture" />
	</ProductionNodes>
</OpenNI>

きちんと出来ていれば、「Success」と表示されます。
f:id:nikuyoshi:20111206173246p:image

先程紹介した本にも書いてある通り、次の場合はエラーが起こります。

  • Kinectが接続されていない場合
  • Kinectが他のプログラムから既に利用されている場合
  • XMLファイルのパスが間違っている場合

ちなみに、Xcode4はXcode3と比べて大分変更がされているようです。
Xcode 4 移行ガイド