2015-02-17

Kinect v2にて人物領域を取得する

Kinect v2ではv1よりフレームワークが変わっているところが所々あります。今回の話は、BodyFrame(人物領域)の取得について。v2からは人物領域だけを格納するBodyFrameというのが新たに用意されました。v1ではDepthFrameからその情報の一部として取得していました。人物だけを表示するには、今までは自前のプログラミングが必要でしたが、その手間がなくなりますね。
KinectSensor kinect;
BodyIndexFrameReader bodyIndexFrameReader;
FrameDescription bodyIndexFrameDesc;
byte[] bodyIndexBuffer;
WriteableBitmap bodyIndexColorImage;
Int32Rect bodyIndexColorRect;
int bodyIndexColorStride;
int bodyIndexColorBytesPerPixel = 4;
Color[] bodyIndexColors;
private void Window_Loaded(object sender, RoutedEventArgs e){
kinect = KinectSensor.GetDefault();
if(kinect!=null){
kinect.Open();
bodyIndexFrameDesc = kinect.DepthFrameSource.FrameDescription;
bodyIndexBuffer = new byte[bodyIndexFrameDesc.LengthInPixels];
//下記は人物領域を表示する際に使う
bodyIndexColorImage = new WriteableBitmap(bodyIndexFrameDesc.Width, bodyIndexFrameDesc.Height, 96, 96, PixelFormats.Bgra32, null);
bodyIndexColorRect = new Int32Rect(0, 0, bodyIndexFrameDesc.Width, bodyIndexFrameDesc.Height);
bodyIndexColorStride = (int)(bodyIndexFrameDesc.Width * bodyIndexColorBytesPerPixel);
bodyIndexColorBuffer = new byte[bodyIndexFrameDesc.LengthInPixels * bodyIndexColorBytesPerPixel];
//
bodyIndexFrameReader = kinect.BodyIndexFrameSource.OpenReader();
//フレーム到着時のイベント設定
bodyIndexFrameReader.FrameArrived += BodyIndexFrameReader_FrameArrived;
}
}
void BodyIndexFrameReader_FrameArrived(object sender, BodyIndexFrameArrivedEventArgs e){
using (var bodyIndexFrame = e.FrameReference.AcquireFrame()){
if (bodyIndexFrame == null){
return;
}
// ボディインデックスデータをバイト配列に格納する
bodyIndexFrame.CopyFrameDataToArray(bodyIndexBuffer);
for (int i = 0; i < bodyIndexBuffer.Length; i++){
//人物領域のインデックス番号を取得
var index = bodyIndexBuffer[i];
//非人物領域は255
if (index != 255){
/** 人物領域に対して何かする
}
}
}


0 件のコメント:

コメントを投稿