【OpenNI】Powerpoint Addin With Kinect

Kinectは画像認識/音声認識に優れたセンサーデバイスです。
現在、Kinectを用いたアプリケーション開発は以下の2つの方法があります。

・オープンソース環境(GPL)のOpenNI+NITE
・マイクロソフト公式のWindows SDK

オープンソースのOpenNI+NITEはジャスチャ―認識(HandsのWave等)を用意していることや、オープンソースライブラリが早くから公開された事で開発者が多く活発なコミュニティが多いです。
一方で、Windows SDKはジャスチャ―認識の実装は自分でコーディングが必要ですがチルトモータの利用やOpenNIで必要なキャリブレーションが必要ないことが特徴です。

今回はOpenNI+NITEの導入から、C♯のパワーポイント用アドインを動かすまでを備忘録として残しておきます。

1. Kinect動作環境の構築

まず,Kinectのドライバをダウンロードします。次に,OpneNI + NITE をサイトトップの Downloads > OpneNI Modules からダウンロードします。

動作環境:WindowsXP 32bit SP2, Intel(R) Core(TM) 2 Quad CPU

2. Kinect接続とサンプルプログラムの動作確認

インストールが完了したら、Kinectを接続してデバイスマネージャを開きます。
下図のようにAudio, camera, motorが認識されていることを確認します。

次にサンプルプログラムが動作するか確認します。
C:\Program Filesの

Primesense > Nite > samples
OpenNI > samples

にサンプルプログラムがあります。

3. パワーポイントのアドインアプリケーション開発

Visual Studio Tools for the Microsoft Office System(以下、VSTO)というOfficアプリケーション開発を支援するツールを用いてパワーポイントのアドインアプリケーション開発します。

VSTOを利用するにはVisual Studio 2010 Ultimateが必要になりますが,評価版なら無料で利用できます。

まず、プロジェクトを開き,参照の追加からOpenNI.Net.dllとXnVNITE.net.dll を追加します。

OpenNI -> C:\Program Files\OpenNI\Bin\OpenNI.net.dll
NITE -> C:\Program Files\PrimeSense\Bin\XnVNite.net.dll

次に、PowerPoint オブジェクトを呼び出すために以下を名前空間に定義します。

using PowerPoint = Microsoft.Office.Interop.PowerPoint;
using Office = Microsoft.Office.Core; 

ThisAddIn クラスではXMLフォーマットの設定ファイルのパスを記述します。このファイルの編集については後程のべます。

private const string CONFIG_XML_PATH = @"C:\Program Files\OpenNI\Data\SamplesConfig.xml";

イベントハンドラとイベントを関連付けます。

pushDetector.Push += new EventHandler(pushDetector_Push);
waveDetector.Wave += new EventHandler(waveDetector_Wave);

例えば,Wave(左右の動き)を検出した時に次のスライドへ進む処理は以下のようになります。

void waveDetector_Wave(object sender, EventArgs e)
        {
            if (SlideShow != null)
            {
                SlideShow.View.Next();
            }
        }

注意するべきところは設定ファイルの編集です。
samplesconfig.xml のProductionNodesに以下のNodeを追加します。xmlの場所はC:\Program Files\OpenNI\Data\samplesconfig.xmlです。

<Node type="Gesture"/>
<Node type="Hands"/>

以上で準備完了です。

Kinectを繋いでパワーポイントを起動させるとアドインプログラムが自動で読み込まれます。
Powerpointの基本的なイベントハンドラはここを参考にしました。