何がしんどいってkinectをハックして使うための参考書やら参考サイトがあるわけじゃないし、
あってもほとんど英語だから頑張って英語読むか、サンプルプログラムを見て理解するしかない・・。
そして行列計算やOpenGLのコードがわんさか出てきます。
それに最近帰るのが遅いから家に帰って夕飯食べて風呂入ったら寝る時間・・学ぶ時間が無い(T_T
とりあえず忘れないうちに覚え書き。
GLを使うとコードが長くなるので、CVで試してみました。
参考にしたサンプルプログラムから更に不要な部分を限界まで削った最小プログラムがこちら。
#include
#include
#include
#pragma comment(lib,"C:/Program files/OpenNI/Lib/openNI.lib")
#define SAMPLE_XML_PATH "C:/Program Files/OpenNI/Data/SamplesConfig.xml"
using namespace cv;
using namespace xn;
int main(){
Context context;
context.InitFromXmlFile(SAMPLE_XML_PATH);
DepthGenerator depth;
context.FindExistingNode(XN_NODE_TYPE_DEPTH, depth);
ImageGenerator image;
context.FindExistingNode(XN_NODE_TYPE_IMAGE, image);
DepthMetaData depthMD;
ImageMetaData imageMD;
Mat depthshow, show;
int key = 0;
while ( key != 'q' ){
context.WaitAnyUpdateAll();
image.GetMetaData(imageMD);
depth.GetMetaData(depthMD);
Mat imni(480,640,CV_8UC3,(uchar*)imageMD.WritableData());
Mat depth16(480,640,CV_16SC1,(unsigned short*)depthMD.WritableData());
cvtColor(imni,show,CV_RGB2BGR);
depth16.convertTo(depthshow,CV_8U,-255/4096.0,255);
imshow("depth",depthshow);
imshow("image",show);
key = waitKey(33);
}
context.Shutdown();
return 0;
}
本サンプルはメタデータとしてRGBデータと、depthデータを取ってきています。
InitFromXmlFileでコンテキストを生成したら、rgm imageとdepthをFindExistingNodeします。
この関数の実体を見てみると
XnStatus FindExistingNode(XnProductionNodeType type, ProductionNode& node) const
となっていました。ProductionNodeクラスをアドレス参照していることに注意。
WaitAnyUpdateAllで情報を更新します。
image.GetMetaData(imageMD);
depth.GetMetaData(depthMD);
でimage, depthそれぞれのメタデータを取得します。
Mat imni(480,640,CV_8UC3,(uchar*)imageMD.WritableData());
Mat depth16(480,640,CV_16SC1,(unsigned short*)depthMD.WritableData());
は、きっと取得したデータをCVで使える行列に変換しておるのでしょう。
CVのMatクラスは使った事無いので後で勉強しておくことにします。
depth16.convertTo(depthshow,CV_8U,-255/4096.0,255);
はメタデータを画像データに変換してるのかな?
どっちにしてもMatクラスを勉強しなきゃ
後は
imshow("depth",depthshow);
imshow("image",show);
で表示してるだけですね。
こんな短くスマートにかけるのはCVならではですね~。
実行したらこうなります。
いや~綺麗にdepthが取れるものですね。