KinectとOpenNI

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

KinectとOpenNI

投稿記事 by Dixq (管理人) » 14年前

kinectでやろうとしたことと全く同じ事をニコニコに先にうpされたので意気消沈してましたけど、勉強を引き続きやってます。

何がしんどいってkinectをハックして使うための参考書やら参考サイトがあるわけじゃないし、
あってもほとんど英語だから頑張って英語読むか、サンプルプログラムを見て理解するしかない・・。
そして行列計算やOpenGLのコードがわんさか出てきます。

それに最近帰るのが遅いから家に帰って夕飯食べて風呂入ったら寝る時間・・学ぶ時間が無い(T_T

とりあえず忘れないうちに覚え書き。

GLを使うとコードが長くなるので、CVで試してみました。
参考にしたサンプルプログラムから更に不要な部分を限界まで削った最小プログラムがこちら。

CODE:

#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;
}
まずコンテキストはXMLファイルから生成するようです。
本サンプルはメタデータとして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が取れるものですね。

アバター
lbfuvab
記事: 72
登録日時: 14年前

Re: KinectとOpenNI

投稿記事 by lbfuvab » 14年前

私は3Dに憧れつつも挫折した組なので、こういうのは凄く好きです。

こういうのを使って、部屋に初音ミ○や神威が○ぽなんかを動かせそうですねw

P.S.
wiiのモーションセンサーを流用出来たら便利なんだけどなぁ、と思う今日この頃。
けど、あのセンサーはリモコンの中なんだなぁ・・・

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: KinectとOpenNI

投稿記事 by Dixq (管理人) » 14年前

動かせますよ~!
週末はそれやろうと思ってたのに地震の影響でネットにつながらなくてなみだ目です:;
被災地の方の苦労と比べたらそんなこと言っていられませんが・・。