Kinectを使ってC#で「バイバイ」を検出する

| コメント(0) | トラックバック(2) このエントリーを含むはてなブックマーク

Kinectというマイクロソフトから販売されたXbox 360向けのゲームデバイスでプレイヤーの位置、動き、声、顔を認識することができたりする。このデバイスを知って、自分は XBox 360 を持っていませが、思わず欲しくなってしまったので、購入しました。

今回は、 KinectをC#から使ってみる(先走り編) で動かしたソースについてみてみます。

インストールについては KinectをPCで使う1 を参照ください。

今回の目標

「手を振ったら」(Waveしたら)それを検出する事をしてみます。もちろん、C# .NET で行います。

結果的には、手を振ったらイベントハンドラが呼ばれるので、そこに処理を書きますが、 C#で記述できるので、比較的楽にかけます。

NITEフレームワーク

Kinectのドライバ、ライブラリ、フレームワークは以下の階層になっているようです

上位
--------
アプリケーション
--------
OpenNI
--------
ドライバー
--------
ハードウェア
--------
下位
 
 

また OpenNI は、ミドルウェアを内包するような形になっているようです。

さらに、それらを扱いやすくする Prime Sense NITEライブラリなるものもあるので、今回は NITEライブラリを使ってみます。

プロジェクト作成

今回は、コンソールタイプのアプリケーションにしておきます。

注意として、.NET Framework は 2.0 〜 3.5 の間を利用してください。最初4.0を使って試してたのですが、だめでしたね。

01
01 posted by (C)k1ha410
02
02 posted by (C)k1ha410

参照の追加

次に、ManagedNite.dll の参照を設定しました。

これは「C:\Program Files\Prime Sense\NITE\Wrappers\C#\Bin\ManagedNite.dll」にあるので、これを参照に追加してください。

03
03 posted by (C)k1ha410

プログラムコード

以下のようなコードを書きました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using ManagedNite;
using System.Threading;


namespace OpenNITest
{
    class Program
    {
        static void Main(string[] args)
        {
            var program = new Program();
            program.Start();
        }
        void Start()
        {
            XnMWaveDetector WaveDetector;

            var context = new XnMOpenNIContext();
            XnMSessionManager sessionManager;
            try
            {
                context.Init();
                sessionManager = new XnMSessionManager(context, "Wave,Click", "RaiseHand");

                sessionManager.FocusStartDetected += new EventHandler<FocusStartEventArgs>(sessionManager_FocusStartDetected);
                sessionManager.SessionStarted += new EventHandler<PointEventArgs>(sessionManager_SessionStarted);
                sessionManager.SessionEnded += new EventHandler(sessionManager_SessionEnded);

                WaveDetector = new XnMWaveDetector();
                WaveDetector.Wave += new EventHandler(WaveDetector_Wave);
                sessionManager.AddListener(WaveDetector);

            }
            catch (ManagedNite.XnMException ex)
            {
                Console.WriteLine(ex);
                throw ex;
            }

            var t = new Thread(() =>
            {
                while (true)
                {
                    context.Update();
                    sessionManager.Update(context);
                    Thread.Sleep(1);
                }
            });
            t.Start();

        }

        void WaveDetector_Wave(object sender, EventArgs e)
        {
            Console.WriteLine("WaveDetector_Wave {0}", e.ToString());
        }

        void sessionManager_SessionEnded(object sender, EventArgs e)
        {
            Console.WriteLine("sessionManager_SessionEnded {0}", e.ToString());
        }

        void sessionManager_SessionStarted(object sender, PointEventArgs e)
        {
            Console.WriteLine("sessionManager_SessionStarted {0} (x,y,z)=({1},{2},{3})", e.GetType().ToString(), e.Point.X, e.Point.Y, e.Point.Z);
        }

        void sessionManager_FocusStartDetected(object sender, FocusStartEventArgs e)
        {
            Console.WriteLine("sessionManager_FocusStartDetected {0} (x,y,z)=({1},{2},{3})", e.GetType().ToString(), e.m_focusPoint.X, e.m_focusPoint.Y, e.m_focusPoint.Z);
        }
    }

}


 
 

このコードで、手を振るとWaveDetector_Waveのハンドラが呼び出されるようになります。

「コンテキスト」「セッション」という状態と、それのリスナーで構成されています。詳しくは、NITEのプログラマーズガイドを読んでください。

決め打ちの設定ファイル

プロジェクトにDataフォルダを作り、そこにopenni.xmlを作ってください。内容は、C:\Program Files\Prime Sense\NITE\Data\Sample-Tracking.xml の内容を参考に記述してください。(そのままでもいいと思います)

04
04 posted by (C)k1ha410

また、このファイルが実行ファイルのカレントディレクトリの直下にdata\openni.xml なければならないので、プロパティで、「コンテンツ」として「新しい場合はコピーする」にしてください。

05
05 posted by (C)k1ha410

これでOKです。

実行結果

このコードだとイベントハンドラでコンソールにテキスト表示してるだけですが、動く事を確認してみます。

実行結果

青い人が来て、手を振ると、WaveDetect と表示されてるのが分かると思います。

おわりに

短いコードで、認識ができます。今回は、手を振るだけでしたが、円などを認識したりすることもできるようです。

色々試してみると面白いと思います。

楽天さんの紹介

これを見て、Kinect買ってみたいという方は以下をチェックしてみてはいかがでしょうか?

(楽天さんのサイトです)

トラックバック(2)

トラックバックURL: http://www.m-tea.info/mt-tb.cgi/85

素敵なエントリーの登録ありがとうございます - .NET Clipsからのトラックバック 続きを読む

C#でハックしてる人にはおすすめ(1から解説) 続きを読む

コメントする

あわせて読みたいブログパーツ

このブログ記事について

このページは、k1ha410が2010年12月25日 16:07に書いたブログ記事です。

ひとつ前のブログ記事は「フロントガラスの油膜取りと撥水処理」です。

次のブログ記事は「Kinect を使った仮想キーボードのプロトタイプ」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。