1.プログラムについて
2.Kinectプログラム共通のプログラム
3.作成プログラム
4.デモ動画
Kinectを用いたプログラムを作成する場合にはいくつかの注意点がある。
まずは動作させるための環境として
開発環境 Kinect for Windows SDK ver1.6
visual C# 2010
が必要となる。これらはインターネットで検索すればすぐに探すことができるのまずはこれらをダウンロードする。
Kinectは最大6台まで接続して使用することができるが、複数のKinectを使用しようとすると処理が重くなり要求されるCPUのメモリも高くなる。そのためHPで紹介するプログラムはすべてKinect1台で用いることを前提にする。
ダウンロード後、実際に起動する。
まずは新しいプロジェクトを作成する。
Kinect for Windows SDKが動作保証をしているのは、コンソールアプリケーション、WPFアプリケーション、Formアプリケーションの3つである。いずれのアプリを使用してもよいが、作成したら最初に必ずやる必要があるものがある。
Microsoft Kinect.dllの宣言である。これにはNUIとオーディオ用などのすべてのKnect機能がカプセル化されているためである。宣言をせずにプログラムを書いてもKinectの各種機能を使用することができない。
まずusingにMicrosoft Kinectを追加する。追加をせずにプログラムを書いてもKinectの各種機能を使用することができない。この状態ではアセンブリ参照が不足していますと出るのでこれを解除する必要がある。
ツールバー→プロジェクタ→参照の追加を選択する。.NETのタブを選択しMicrosoft Kinectを選ぶ。
これによりアセンブリ参照不足は解除されることになる。またMicrosoft Kinectのverがダウンロードしたものと異なる場合にはうまく動作しないので合わせる必要がある。
追加することができたらあとは自由にプログラムを組むことができる。
Kinectを用いたプログラムを作成するにあたって共通のプログラム部分が存在する。
Kinectセンサーの接続
Kinectアプリケーションの開発はKinect センサーオブジェクトを使用することから始まる。
このオブジェクトはKinectハードウェアそのものを表しており、カラー画像や深度画像、スケルトン画像を使用するにはこのオブジェクトを用いて処理をしている。センサーのストリームからデータを得る方法としては、Kinectセンサーオブジェクトの一連のイベントを使用することがあげられる。
各データストリーム(colorsteream,depthstream,skeletonstream)にはイベントが関連図けられていてストリーム上でデータのフレームが使用可能になると、各イベントが発生する。例えばcolorstream上で新しいデータがフレームにパッケージ化されるとcolorframereadyイベントが発生する。
センサーの接続の検出
Kinect Sensor のオブジェクトは自動的に作成されない。KinectをPCに接続することで、SDKが接続を検出し自動的にオブジェクトを実行する。従って、接続しない場合には各画像を得ることができないようになっている。Kinectセンサーの初期化はConnrcted状態にならないとできず、Disconnected状態(USBがPCから外れること)になるとアプリケーションが一時停止する。
センサーの開始
Kinectを検出したらKinectがデータの生成を開始するように、初期化しなければならない。
この初期化の段階は3段階存在する。
1.ストリームを初期化する sensor.Colorstream.Enable();
2.ストリームからフレームデータを抽出する sensor.ColorFrameReady +=Kinect.ColorFrameReady;
3.抽出したデータを処理 sensor.Start();
この三段階の処理によりセンサーは動作する。
センサーを停止
開始したKinectセンサーはstopメソッドを呼び出して停止する。これらのメソッドを使用しなければならない理由としてはスイッチをオフにするためだけでなく、Kinectセンサーオブジェクトとそのストリームにはシステムリソースが使われているので、アプリケーションを正常に動作させるためにも、使わないセンサーなどは停止してリソースを解放しなければならない。
今まで言ったことの実際のプログラム(共通部)
RGBカメラ・深度カメラ・スケルトンの画像の取得と表示の例
RGBカメラ
黄色の部分が、カラー画像を表示するのに必要なプログラムである。
カラー画像を使用する場合にはとりあえずこの部分を書いておけば使用することができる。
深度カメラ
深度画像の取得
深度画像の表示
スケルトン
データストリームの座標について
Kinectにはカラー画像、深度画像、スケルトン画像の取得があり、これらは各データストリームから提供される。
また、各データストリーム(colorsteream,depthstream,setonstream)が返す座標はそれぞれ数値が異なっている。
これにより、例えば骨格位置をカラー画像の人物に合わせて表示しようとした場合には、スケルトンの各骨格座標をカラー画像に変換する必要がある。
Kinectには各データ座標を返還する一連のメソッドが用意されている。
例)MapDepthToColorImagePoint(デプス座標をカラー座標へ)
MapColorToSkeletonPoint(カラー座標をスケルトン座標へ)
MapSkeletonToDepthPoint(スケルトン座標をデプス座標へ)
金額表示プログラム
kinectを使用したプログラムとして、人物を認識しその人物の上に何らかの文字を表示するプログラムを作成する。
今回は、kinectがバス内に設置されていると仮定して、人物を認識しているときにボタンを押すとその時点の金額が頭上に表示され、ボタンが押されるごとに金額などが表示されるようにする。
プログラムを1から作成するのは大変なので既存のプログラムを流用して作成する。
開発環境 Kinect for Windows SDK ver1.6
visual C# 2010
流用するプログラムはAD-コンバータの時にも用いたAR_sensingを用いる。
うまく起動させるためには
1.頭上に表示させたいので頭の位置x軸、y軸が必要
これはスケルトンデータから取得できると考えられる。
2.取得した座標を、カラー画像用に変換する。
変換をかけない場合にはうまく表示できない。
3.このような処理をボタンがクリックされたときに表示されるようにする。
画面の加工
画面の操作としては、MainWindow左側のツールボックスにマウスを合わせれば様々なツールが出てくるのでこれをクリックして画面の任意の場所に配置すれば
その場所にボタンなどのアイコンを置くことができるようになる。アイコンをダブルクリックすればそのアイコンのコードが表示されるのでそこに操作したいようにプログラムを書けば動かしたいように動くようになる。
今回はボタンのアイコンを増やした。
新しく配置したアイコンをダブルクリックし、アイコンのコードを表示する。
黄色の部分はボタンをクリックすると現れる基本のコードである。この中に操作をしたいプログラムを書き込むことでボタンをクリックしたときにその操作が出る。今回は何回ボタンを押したかをカウントするzという変数を入力している。ボタンをクリックするごとにzは増え続け15回クリックしたら0に戻るようにした。これでクリックしたときに金額や駅名が出るための下地は完成した。
注意として一番最初にはzの変数の種類などを宣言しておかねばならない。
次にボタンを押したときに金額や駅名が出る場所のプログラムについて記述する。
まずif文について見てみると。頭部を見つけたら場合に以下のプログラムを実行するということが分かる。
頭部がトラッキング状態になっていない場合にはこの分は実行されない。
Ps =の文では頭部の座標が入る。しかしこの状態ではカラー画面の座標ではないので、この座標をもとに描画しようとしてもカラー画面に反映させることはできない。したがって次の文でカラー画面への座標の変換をする。
この文ではスケルトン座標をカラー座標に修正するメソッドを使用しており、()文では640*480、フレーム30においてのカラーストリーム画像に修正するという指示を出す。
座標についての変換はここまでで、次の段落からはカラー画像に描画するプログラムについて記述している。
string文では先に書いたカウント文についてで、ボタンを押した回数で各数字や文字が変化する。赤文字の部分では実際にカラー画像へ描画するプログラムである。
駅名は固定して表示するので、注目すべきは金額の描画についてである。特にPc.X, Pc.Yはカラー画像の座標であり、この座標の代わりに別の変数や数字を入れてもカラー画像上の座標ではないのでうまく表示はしない。
プログラムの実行
以上のような、プログラムを実装するだけで骨格を追尾して文字や数字を追加するプログラムが完成できる。
また、今回のプログラムはスケルトンデータの頭部を認識した人に金額が出て追跡するようになっているが、一人分しか追跡をしない。そのため改良をする必要ながある。深度データからでも人物の認識はすることができるので、深度データから表示をするようにすれば6名分の金額の表示ができると考えられる。
金額表示プログラムのデモ動画
人物が映るとスケルトン画像を人物に重ね合わせる。頭部をトラッキングしている状態で、ボタンを押すと金額が出て頭部を追尾する。また手の残像履歴を表示し、センサのボタンをクリックすることでセンサが観測した温度や光量の大きさに応じて色が変わる。
動画