kinectセンサーからのビデオデータ取得

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ryuuhei

kinectセンサーからのビデオデータ取得

#1

投稿記事 by ryuuhei » 14年前

はじめまして。現在「kinectセンサープログラミング」という本を見ながらkinectからのビデオデータ取得をしようとしているのですが、
初心者で、よくわかりません。

本でのサンプルコード「3.2.11 kinectから取得したデータを記録する(p185)」の通りに書き、実行できたのですが、
デプスデータ、イメージデータ共にoniファイルに書き出しているので、今後の処理の際にイマイチ不便です。

なのでwmvファイルにイメージデータのみを書き出したいのですが、 const char* RECORD_PATH = "record.oni" の部分を "record.wmv"にしても、イメージデータが再生できないと出てしまいます。

また、wmvファイルにできない場合、oniファイルにイメージデータのみを一画面に表示させたいのですが、デプスデータ取得、記録のコードを削っても、
ファイルを開くと 「Depth stream OFF」と表示されて、その横にイメージデータが表示されてしまいます。
このデプスデータの枠そのものを消したいのですが、どうすればいいでしょうか。

勉強不足で申し訳ありませんが、よろしくお願いします。

コード:

 

// 3.2.11 kinectから取得したデータを記録する (p185)

#include <iostream>
#include <stdexcept>

#include <opencv/cv.h>
#include <opencv/highgui.h>

#include <XnCppWrapper.h>


const char* CONFIG_XML_PATH = "SamplesConfig.xml";
const char* RECORDE_PATH = "record.oni";

int main (int argc, char * argv[])
{
	IplImage* camera = 0;

	try{
		//コンテキストの初期化
		xn::Context context;
		XnStatus rc = context.InitFromXmlFile(CONFIG_XML_PATH);
		if (rc != XN_STATUS_OK){
			throw std::runtime_error(xnGetStatusString(rc));
		}

		//イメージジェネレータの作成
		xn::ImageGenerator image;
		rc = context.FindExistingNode(XN_NODE_TYPE_IMAGE, image);
		if(rc != XN_STATUS_OK){
			throw std::runtime_error(xnGetStatusString(rc));
		}

		//デプスジェネレータの作成
		xn::DepthGenerator depth;
		rc = context.FindExistingNode(XN_NODE_TYPE_DEPTH, depth);	
		if(rc != XN_STATUS_OK){
			throw std::runtime_error(xnGetStatusString(rc));
		}

		
		//デプスの座標をイメージに合わせる
		depth.GetAlternativeViewPointCap().SetViewPoint(image);


		//レコーダーの作成
		xn::Recorder recorder;
		rc = recorder.Create(context);
		if ( rc != XN_STATUS_OK){
			throw std::runtime_error(xnGetStatusString(rc));
		}

		//記録設定
		rc = recorder.SetDestination(XN_RECORD_MEDIUM_FILE, RECORDE_PATH);
		if ( rc != XN_STATUS_OK){
			throw std::runtime_error(xnGetStatusString(rc));
		}

		//イメージを記録対象に追加
		rc = recorder.AddNodeToRecording(image, XN_CODEC_JPEG);
		if ( rc != XN_STATUS_OK){
			throw std::runtime_error(xnGetStatusString(rc));
		}

		//デプスを記録対象に追加
		rc = recorder.AddNodeToRecording(depth, XN_CODEC_UNCOMPRESSED);
		if ( rc != XN_STATUS_OK){
			std::cout << __LINE__ << std::endl;
			throw std::runtime_error(xnGetStatusString(rc));
		}

		//記録開始(WaitOneUpdateAllのタイミングで記録される)
		rc = recorder.Record();
		if ( rc != XN_STATUS_OK){
			throw std::runtime_error(xnGetStatusString(rc));
		}

		//カメラサイズのイメージを作成(8ビットのRGB)
		XnMapOutputMode outputMode;
		image.GetMapOutputMode( outputMode );
		camera = ::cvCreateImage(cvSize(outputMode.nXRes, outputMode.nYRes),IPL_DEPTH_8U, 3);
		if (!camera){
			throw std::runtime_error( "error : cvCreateImage");
		}


		//メインループ
		while(1){
			//カメライメージの更新を待ち、画像データを取得する
			context.WaitAndUpdateAll();
			xn::ImageMetaData imageMD;
			image.GetMetaData(imageMD);

			//カメラ画像の表示
			//kinectからの入力がBGRであるため、RGBに変換して表示する
			memcpy(camera->imageData, imageMD.RGB24Data(), camera->imageSize);
			::cvCvtColor(camera, camera, CV_BGR2RGB);
			::cvShowImage("KinectImage", camera);

			//キーイベント
			char key =cvWaitKey(10);
			//'q'を押されたら終了する
			if(key == 'q'){
				break;
			}
			//'m'が押されたら反転する
			else if(key == 'm'){
				context.SetGlobalMirror(!context.GetGlobalMirror());
			}
		}
	}
	catch (std::exception& ex){
		std::cout << ex.what() << std::endl;
	}

	::cvReleaseImage(&camera);

	return 0;
	}





 

“C言語何でも質問掲示板” へ戻る