初心者で、よくわかりません。
本でのサンプルコード「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;
}