このエントリはOpenNI Advent Calendar 2011 : ATNDの12月14日分です
Advent Calendarでの、僕の全プロジェクトはこちらです
OpenNI + NITE の Hello Worldは何がいいなぁとずっと考えていたんですが、OpenNI ArenaにとてもよいHello Worldがあったので、それをC#版にしてみました。
やってることは簡単で、Waveジェスチャーを検出すると「Hello World」がでる。というものです。
とても簡単ですが、OpenNIとNITEの動作確認にもなりますし、何より「手を振る」ことが自然なHello Worldですね。
こんなコード
参考にしたHello Worldをさらに必要最低限に絞って作りました。
// see:http://arena.openni.org/OpenNIArena/Applications/ViewApp.aspx?app_id=424 using System; using System.Reflection; using NITE; using OpenNI; namespace HelloOpenNI { class Program { static void Main( string[] args ) { ScriptNode node; Context context = Context.CreateFromXmlFile( "../../SamplesConfig.xml", out node ); SessionManager sessionManager = new SessionManager( context, "Wave", "RaiseHand" ); sessionManager.SessionStart += new EventHandler<PositionEventArgs>( sessionManager_SessionStart ); WaveDetector wave = new WaveDetector(); wave.Wave += new EventHandler( wave_Wave ); sessionManager.AddListener( wave ); Console.WriteLine( "Start gesture recognize." ); while ( !Console.KeyAvailable ) { context.WaitAndUpdateAll(); sessionManager.Update( context ); } } static void sessionManager_SessionStart( object sender, PositionEventArgs e ) { Console.WriteLine( MethodBase.GetCurrentMethod().Name ); } static void wave_Wave( object sender, EventArgs e ) { Console.WriteLine( MethodBase.GetCurrentMethod().Name + ": Hello OpenNI!!" ); } } }
プロジェクトの設定など
プロジェクトはC#のコンソールアプリケーションにしました。
参照するライブラリは次の二つです。最初は「最近使用したファイル」にないので、「参照」から選択してください。
OpenNIの初期化
表だってOpenNIは使いませんが、NITEが内部的にOpenNIを使用するので、Contextの初期化のみ行います。
ScriptNode node; Context context = Context.CreateFromXmlFile( "../../SamplesConfig.xml", out node );
NITEの初期化
NITEの初期化を行います。NITEの基本はSessionManagerです。セッションが有効である間だけ、ジェスチャーを認識します。今回は、セッションに入るためのジェスチャーにWave(手の左右移動)を使っています。セッションに入ったことを知るためにSessionManager.SessionStartイベントを登録します。
SessionManager sessionManager = new SessionManager( context, "Wave", "RaiseHand" ); sessionManager.SessionStart += new EventHandler<PositionEventArgs>( sessionManager_SessionStart ); ... static void sessionManager_SessionStart( object sender, PositionEventArgs e ) { Console.WriteLine( MethodBase.GetCurrentMethod().Name ); }
Waveジェスチャー検出の設定
Waveジェスチャー検出の設定を行います。NITEのジェスチャー検出器の設定は、大きく次の4ステップです。
- ジェスチャー検出器を作成する
- ジェスチャー検出の設定をする
- ジェスチャー検出イベントを登録する
- Sessionmanagerに検出器を登録する
今回は、設定を行わないので、3ステップとなっています。
ジェスチャー検出イベントで「Hello World」を出力します。
WaveDetector wave = new WaveDetector(); wave.Wave += new EventHandler( wave_Wave ); sessionManager.AddListener( wave ); ... static void wave_Wave( object sender, EventArgs e ) { Console.WriteLine( MethodBase.GetCurrentMethod().Name + ": Hello OpenNI!!" ); }
メインループ
キーが押されるまで、OpenNIとNITEを更新し続けます。
while ( !Console.KeyAvailable ) {
context.WaitAndUpdateAll();
sessionManager.Update( context );
}
まとめ
全体でも40行ちょいにもかかわらず、ジェスチャー検出までできるので、とても素敵なHello Worldですね。