トックのCG部屋-トップ別室へ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

KinectのNUIでデプス情報をとるための最低限のサンプル

名前の通り
NUIを使ってKinectからデプス情報を取り出したいんだけど
なんかそれっぽいサンプルコードがなかったから
公式SDKのサンプルのドキュメント見て
最低限どうすれば良さそうかってのを書いてみた
まぁつまりいつものやつですわ

ちなみに描画のコードは面倒なのでオミット
OpenGL使うなりOpenCV使うなり自由にしてくださいな
結局情報とれたらあと表示したり何か処理するところは
基本的にNUIに依存しないと思うんで
後今回はデプスって事になってるけど
フラグとか少し変えれば色も取れると思うよ

後は追記で

というわけでコードは下のようなかんじ
#include <windows.h>
#include <NuiApi.h>

int main()
{
INuiSensor* pSensor;
NuiCreateSensorByIndex(0,&pSensor);
pSensor->NuiStatus();
pSensor->NuiInitialize(NUI_INITIALIZE_FLAG_USES_DEPTH);

HANDLE hndl=CreateEvent(NULL,NULL,NULL,NULL);//この辺謎
HANDLE stream;
pSensor->NuiImageStreamOpen(
NUI_IMAGE_TYPE_DEPTH,NUI_IMAGE_RESOLUTION_640x480,
NUI_IMAGE_STREAM_FLAG_ENABLE_NEAR_MODE,//near modeじゃない場合はNULLでいい
NUI_IMAGE_STREAM_FRAME_LIMIT_MAXIMUM,
hndl,&stream);

//以下はメインループか何かの中で使う
NUI_IMAGE_FRAME frame;
pSensor->NuiImageStreamGetNextFrame(stream,1000,&frame);
NUI_LOCKED_RECT rect;
frame.pFrameTexture->LockRect(0,&rect,NULL,NULL);

//rectの中にデプス情報が入る
//rect.Pitchが横方向のバイト数
//rect.pBitsがデータの配列

frame.pFrameTexture->UnlockRect(0);
pSensor->NuiImageStreamReleaseFrame(stream,&frame);
//メインループここまで

pSensor->Release();

}

正直フラグ関係とか引数とか詳しいことはよくわかってないところも多いから
関数名でググれば公式のドキュメント引っかかるからそれ見てねと
基本的にやってることは関数の名前通りだと思う

//以下はイベントループか何かの中で使う
から
//イベントループここまで
が実際にフレームの情報とってるところだから
こんなかんじのを実際に情報使うところで書いてくださいということ

NUI_IMAGE_FRAMEのpFrameTextureとNUI_LOCKED_RECTは
DirectX9使ってる人はあのサーフェスとかのやつとほぼ一緒だからわかりやすいと思う
注意しなきゃいけないのはPitchはバイト数だから
Pitch=画像の幅*1ピクセルのバイト数
になってるってこと
今回のコードだとおそらく1ピクセル当たり2バイトになるはず
インデックスは上位ビット→下位ビットの順で並んでるのと
デプス情報は下位12ビットしか使ってない(プレイヤーIDを取らない場合)らしいから
(rect.pBits[i*2+1]<<8)|rect.pBits[i*2]
※iはピクセルのインデックス=y*フレームの幅(ここでは640)+x
で各ピクセルのデプス値がとれる

まぁ最低限と言ってるだけ合ってかなり省略してて
だいたいの関数,メソッドはHRESULTで正しく動いたかを返してるから
本当はちゃんと受け取ってS_OKになってるかどうか判定して
エラー処理とかなにかを書いた方がいい
NuiStatus()とかただ呼ぶだけなら正直意味ないから呼ばなくていい

それと本当はNuiCreateSensorByIndexの前に
HRESULT NuiGetSensorCount(int *pCount)
でKinectの(?)数取ってきたほうがいいっぽいけど
どうせ1つしか使ってないからとindexに0入れて終わりにしてる

あとはNuiImageStreamGetNextFrameの第二引数は
おそらくタイムアウトの時間(ms)的なものだと思うんだけど……
正直怪しい

とまぁこんな感じ
一応動いてはいるけど間違ってるかも

それと一度実行してたとき
何度実行してもフレームの情報が取れなかった時があって
Kinect一度切って繋ぎ直したら直った
多分フレームか何かの開放ミスだったのかなぁと
  1. 2013/08/29(木) 02:49:14|
  2. 試験的な物
  3. | トラックバック:0
  4. | コメント:0
<<そうたんけんちゃん完成、りょうちん修正 | ホーム | 1時間で何かをレンダリングするレンダラ>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://took.blog72.fc2.com/tb.php/834-8b311b46
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

Author:トック

プロフィール(仮)

twitter:elgraiv_took
└ブログ更新情報

twitter:elgraiv_take
└無駄な日常つぶやき用

FC2カウンター

コンテンツ一覧

本棚

最近の記事

カテゴリー

月別アーカイブ

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。