Kinect for Windows v1.8 スケルトントラッキング(骨格認識) サンプルプログラム (C++) ~MSR_NuiApi.hは死んだ、NuiApi.hでの環境構築~
これ以上犠牲者を出さないように、めちゃくちゃ分かりやすく、引っかかりやすいタイトルで書きました。
2010年に発売されて以来、興味本位で購入したものの押し入れの奥でホコリ被っていそうなKinect v1。
いざ取り出して使ってみようとするも、サンプルプログラムは2010年~2012年のSDKの古いバージョンのサンプルばっかで動かねえよボケナスってブチ切れてインターネットの海を彷徨って時間を無駄に過ごしている人も多いのではないでしょうか。特にアカデミックな分野で 無 理 矢 理 使わされてる学生の方々。
この記事は以下のような方を対象としております。
・Kinect v1とv2とXBOXの三種のうち、v1(for Windows)を持っている
・C++でKinect v1のサンプル動かしたいけど設定めんどくてグラフィカルな表示はいらない
・MSR_NuiApi.hをNuiApi.hに書き換えたは良いものの設定が分からずC++のサンプルプログラムが動かせない
C#で動かしたい方は、書籍やネットに動くサンプルがたくさん転がっているのでそちらを参考にしてください。
少し小言を。
なんでC++かというと、C言語で書かれたハードウェア制御のプログラムを簡単に絡められる(文法同じだから脳死でできる)のと、DXライブラリで簡単に描画できるから。
「ワイ、おもろいコントローラー作ったで~、Kinectで身振り手振りも使って操作もしたいけん、そんでもってゲームに反映させたいんや!」って分野にはかなり需要がある。いわゆるインタラクション分野ですね。土下座ダンスがある某ダン○ボとかそういうイメージ。
すぐ実践できて参考になるC++のサンプルがネットにないのよね。まず、環境設定すら省いてるようなサイトしかヒットしない(書籍買えってこと)上に、バージョンもβとかv1.0のものばかりで書籍の環境設定すら現行のv1.8では役に立たない。
OpenNIやらOpenCVが必須だの本やサイトにあるけれど、初心者は新しい言葉が乱発してそれぞれの言葉と概念、その関係性が理解できないんですよ。
こういうデバイスに興味持った人はサンプルが動けばうおーすげー!とはなるのだけれども、プログラミング以前に環境の構築で躓いて時間を浪費してしまい、環境ができる頃には感動が冷めてしまう。TAとしても必要のない準備の時間は非常におもろくない。
ムシャクシャしてきたので自分用の覚書としてこの記事を書くまでに至ります。
ほいでは、前置きはこのくらいにしておいて、環境構築に移っていきます。
とりあえずインストールしとけってものは、たった2つです。
・Visual Studio 2015
Overview of Visual Studio 2015 Products
Visual C++ 2010 Expressが入ってるなら入れなくてもいい。
でも、どうせ色んな言語使うのならまとまってる2015使ったほうが楽です。
Download Kinect for Windows SDK v1.8 from Official Microsoft Download Center
これに付属(?)している開発ツールキットも動作確認に必須です。
全部インストール終わったらサンプルの動作確認をしてください。
C:\Program Files\Microsoft SDKs\Kinect\Developer Toolkit v1.8.0\bin\
この中に色々サンプルが転がってるので触ってみてください。動かない場合は
・Kinectの電源を入れ忘れてる
・ドライバがインストールされていない
などが考えられます。他のサイトに対処法がたくさん乗ってますので適宜参照してください。
DepthBasics-D2D.exeのような関節の点が今回組むプログラムの中で動いています。
SDKの動作確認ができたらプログラミング環境の構築に移ります。
①新規プロジェクトの作成
まずはVisual Studioを開き、
新規作成 > 新しいプロジェクト > C++ > Win32コンソールアプリケーション
と選択し新規プロジェクトを作成します。
プロジェクトの名前は「KinectTest」とでもしておきましょう。
OKを押すとアプリケーションウィザードが開きますので 次へ を押します。
ウィンドウ中央の "追加のオプション" の項目に 空のプロジェクト(E) がありますので、チェックボックを付けてから完了をクリックしてください。
②プロパティの設定
プロジェクト(P) > プロパティ (P) を選択し、プロパティページを開きます。
(Alt+F7で一発で開けるので慣れておくと楽ちんです。)
(2-1)インクルードディレクトリの設定
構成プロパティ>VC++ディレクトリ を開く。
"インクルードディレクトリ"にマウスを持って行くと▼が表示されるので<編集…>をクリック。
空欄をクリックし、[…]を選択。
C:\Program Files\Microsoft SDKs\Kinect\v1.8\inc\ [フォルダーの選択]
こうなっていればOKです。
(2-2)ライブラリディレクトリの設定
インクルードディレクトリの2つ下にあるライブラリディレクトリも同じように
C:\Program Files\Microsoft SDKs\Kinect\v1.8\lib\x86 [フォルダーの選択]
libまでではなく、 x86まで 入れてください。
(2-3)追加の依存ファイルの設定
構成プロパティ > リンカー > 入力 > (一番上にある) 追加の依存ファイル > 編集…
Kinect10.lib と記入してください。
以上で環境の構築は終了です。
次からは実際に使えるサンプルプログラムに移っていきます。
③サンプルプログラム
まずは以下のソースファイルをダウンロードして、自分の作ったプロジェクトと同じフォルダに入れてください。デフォなら
C:\Users\[ユーザ名]\Documents\Visual Studio 2015\Projects\KinectTest
に入れておけばOKです。
フォルダに入れ終わったらソリューションエクスプローラのソースフォルダを右クリックし、
追加 > 既存の項目(G) からKiectTest.cppを選択してください。
ソースはたったこれだけでOKです。楽勝な感じがします。
次に以下のソースファイルをダウンロードして、先ほどと同じフォルダに入れてください。
ソリューションエクスプローラのヘッダーのフォルダを右クリックし、
追加 > 既存の項目(G) からKinectSkeletonTracking.hを選択してください。
あとはビルドを実行し、Kinectの前で腕を振ってみてください。
このようにコンソールに表示されれば成功です。
身体を動かしてみて座標が対応して動いているのさえ分かれば、データ取得間隔を短くして平均値を取ってみたり、中央値取ったり、少しデータの使い方を工夫すれば腕のジェスチャ認識ができてしまいます。
実際に扱うデータはおそらくこの程度だと思いますので、単にデータを取得したいだけならOpenNIやらOpenCVは要らないと思います。
Kinect自体のプログラムは100行程度ですので、Kinectプログラミング自体がやろうとしていることの足を引っ張ることはないはずです。
ヘッダーファイルをいじって取得したい箇所を増やし、MMDなどのpmxモデルのボーンを対応させ、頂点と関節の関係を変換行列で組めばMMDのKinectトラッキングを自作できます。(憶測ですがDXライブラリ使っても1000行は軽く超えるはずなのでデータの使い方を工夫してモーションに無理矢理対応させたほうが何倍も楽にできるかもしれません。)
ネットに転がっているヘッダ名が"MSR_NuiApi.h"となっているものもKinect SDK内にある同名のヘッダファイルの"NuiApi.h"などに書き換え、環境も②の通りにすれば動くものがいくつかあったので今まで動かなかったサンプルをダメ元でやってみたら、もしかしたら動くかもしれませんね。
今日はこの辺で。質問などがあればコメントで受け付けます。
お腹空いた。家帰って飯食ってもう寝たい・・・(;´ω`)