NtKinectを利用して OpenCV や Kinect V2 の基本的機能を使う DLL ファイルを作成し、 他の自作のプログラムや Unity から利用する方法は 「NtKinect: Kinect V2 を使うプログラムをDLL化してUnityから利用する」 で説明しました。
本稿では、骨格認識を行う DLL ファイルを作成する方法について解説します。
では実際に既存の DLL ファイルを必要とする Kinect V2 の例として、 顔認識を行う DLL ライブラリを作成してみましょう。
マゼンタ色の部分が今回追加した関数のプロトタイプ宣言です。
NtKinectDll.h |
|
int setSkeleton(void *, float *data,int* state, int *id) 関数の定義を追加します。 この関数ではまず、 カメラで取得した画像を1/16に縮小してその上に関節を赤で描画してからcv::imshow()で表示しています。 ウィンドウの内容を正しく表示させるためにはcv::waitKey(1)を呼び出す必要があります。 1つの関節の位置は3個のfloat値で表現されていて、 一人につき 25 個の関節の位置が得られます。 最大で6人分の骨格が認識されるので、 data 領域はこの関数を呼び出す側で 「floatのバイト数 * 3 * 25 * 6 」バイト以上確保されている必要があります。 返り値は、認識できた骨格の個数です。
NtKinectDll.cpp |
|
[注意](2017/10/07 追記) Visual Studio 2017 Update 2 でのビルド時に「dllimport ...」というエラーが起きる場合は こちらを参考にして NtKinectDll.cpp 内で NTKINECTDLL_EXPORTS をdefineする ことで対処して下さい。
上記のzipファイルには必ずしも最新の NtKinect.h が含まれていない場合があるので、 こちらから最新版をダウンロードして 差し替えてお使い下さい。
NtKinectDll.dll を Unityで利用します。
Hierarchy上で Skeleton を選択して、Inspectorで設定からResetとして Transform の Position x, y, z をそれぞれ 0 に初期化しておきます。
上部のメニューから「Assets」-> 「Create」 -> 「C# Script」 -> ファイル名は NtKinectBehaviour
C++ のポインタは C# では System.IntPtr として扱います。
NtKinectBehaviour.cs |
|
カメラの位置はデフォルトでは (x,y,z)=(0,1,-10)になっているはずです。 認識された骨格はz座標が正なのでカメラの位置は(x,y,z)=(0,0,-1)としてみましょう。
[注意] 骨格認識の状態を表示するためにDLL内でOpenCVのウィンドウを生成しています。 後から生成されたこのウィンドウにフォーカスがあるときは (= Unityのウィンドウにフォーカスがない場合は) Unityの画面は変化しないので注意して下さい。 Unityのウィンドウの上部をクリックしてUnityのウィンドウにフォーカスが ある状態で動作を試して下さい。