解像度の違いに注意
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の内容をコピーしているのがポイントです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//人物インデックスフレームデータを_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 件のコメント:
コメントを投稿