Loading [MathJax]/extensions/tex2jax.js

2015-03-13

Kinect v2でBodyIndexFrameを利用して人物画像(RGB)を抜き出す

Kinect v2 にて人物画像のみを表示するという初歩的なプログラムを、v1でもやっていたので練習がてらに試してみたのだが、初歩的なところで躓いたところとか、ネットをいろいろググってみて気づいたポイントをピックアップします。

解像度の違いに注意
v1では、Color画像とDepth画像の解像度が同じ(640 x 480)でしたから、Depthで人物領域に対応するColor画像のピクセルを描画するだけで表示できました。しかし、v2 では、Color画像の解像度が(1980×1080)、Depthが(512×424)と大幅に異なるため、描画サイズを気をつけないとおかしなことになります。

抜き出しサイズは512×424
人物領域のサイズが小さいわけですから、基本的にそれにあわせる必要があります。サンプルプログラムでクロマキー処理みたいなことをしてるのがあり、それは横長に写ってるんですが、実際に人物を特定できる領域は512×424と考えたほうがいいです。もちろん、アップスケーリングな処理を自前で実装できるのであればその限りではありません。

座標合わせにDepthFrameが必要
v2では、BodyIndexFrameという人物領域のマスク情報を持った新しいフレームが用意されました。しかし、座標合わせとして、CordinateMapperクラスにBodyIndexFrameに対応するメソッドが用意されていません。
coordinateMapper.MapDepthFrameToColorSpaceメソッド
を利用する必要があります。 つまり、座標合わせにDepthFrameを呼び出しておく必要があります。この辺りのAPIがまだ中途半端ですね。

上記以外はv1と特に変わらない
ネットでいろいろサンプルを調べてみると、ポインターの利用やunsafeな処理をするなど、何やら難しげなのを見かけましたが、基本的にv1でやっていたやり方でOKです(別にポインターの利用やunsafeな処理がダメと言うわけではありません)。v2に変わって何か特別な処理をしなければいけないというわけではないので、安心してください。

下記にサンプルを一部抜粋します。BodyIndexFrameのデータを走査しながら、ColorFrameの内容をコピーしているのがポイントです。
//人物インデックスフレームデータを_bodyDataにコピー
bodyIndexFrame.CopyFrameDataToArray(_bodyData);
//depthframeからカラースペースに
kinect.CoordinateMapper.MapDepthFrameToColorSpace(_depthData, _colorPoints);
for (int depthIndex=0; depthIndex < length; depthIndex++){
byte player = _bodyData[depthIndex];
//もし人物の領域ならば
if (player != 0xff){
ColorSpacePoint colorPoint = _colorPoints[depthIndex];
//整数に変換している
int colorX = (int)Math.Floor(colorPoint.X + 0.5);
int colorY = (int)Math.Floor(colorPoint.Y + 0.5);
//すべて正ならば そこだけをカラーで表示
if ((colorX >= 0) && (colorX < colorWidth) && (colorY >= 0) && (colorY < colorHeight)){
int colorIndex = ((colorY * colorWidth) + colorX) * BYTES_PER_PIXEL;
int displayIndex = depthIndex * BYTES_PER_PIXEL;
//RGBカメラの色情報を表示用Byte配列へコピー
outputColor[displayIndex + 0] = _colorData[colorIndex];
outputColor[displayIndex + 1] = _colorData[colorIndex + 1];
outputColor[displayIndex + 2] = _colorData[colorIndex + 2];
outputColor[displayIndex + 3] = 0xff;
}
}


0 件のコメント:

コメントを投稿