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

Natural Software

KinectなどのDepthセンサーを中心に活動しています

OpenNI + NITE のHello World( C# ) #openni_ac

Kinect

このエントリは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ステップです。

  1. ジェスチャー検出器を作成する
  2. ジェスチャー検出の設定をする
  3. ジェスチャー検出イベントを登録する
  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ですね。