ブログ@kaorun55

HoloLensやKinectなどのDepthセンサーを中心に書いています。

OpenNI2(Beta) 入門(7) :データの記録と再生

OpenNIの特長的な機能である、データの記録と再生も大幅に使いやすくなっていました。

プログラム的にデータの入出力ができるので、Kinectを使う場合はKinect Studioと用途に合わせて使い分けができますね。

#include <OpenNI.h>

#include <opencv2\opencv.hpp>

#include <vector>

void main()

{

try {

openni::OpenNI::initialize();

openni::Device device;

auto ret = device.open( openni::ANY_DEVICE );

if ( ret != openni::STATUS_OK ) {

throw std::runtime_error( "" );

}

openni::VideoStream colorStream;

colorStream.create( device, openni::SensorType::SENSOR_COLOR );

colorStream.start();

openni::Recorder recorder;

recorder.create( "kinect.oni" );

recorder.attach( colorStream );

recorder.start();

std::vector<openni::VideoStream*> streams;

streams.push_back( &colorStream );

cv::Mat colorImage;

while ( 1 ) {

int changedIndex;

openni::OpenNI::waitForAnyStream( &streams[0], streams.size(), &changedIndex );

if ( changedIndex == 0 ) {

openni::VideoFrameRef colorFrame;

colorStream.readFrame( &colorFrame );

if ( colorFrame.isValid() ) {

colorImage = cv::Mat( colorStream.getVideoMode().getResolutionY(),

colorStream.getVideoMode().getResolutionX(),

CV_8UC3, (char*)colorFrame.getData() );

cv::cvtColor( colorImage, colorImage, CV_BGR2RGB );

cv::imshow( "Color Camera", colorImage );

}

}

int key = cv::waitKey( 10 );

if ( key == 'q' ) {

break;

}

}

}

catch ( std::exception& ) {

std::cout << openni::OpenNI::getExtendedError() << std::endl;

}

}

基本はOpenNI2(Beta) 入門(1) :Colorカメラの画像を表示するのコードです。ここに記録用のコードが入っています。openni::Recorderクラスで記録ができます。ファイル名と、記録するストリームを指定して開始します。

openni::Recorder recorder;

recorder.create( "kinect.oni" );

recorder.attach( colorStream );

recorder.start();

再生は、openni::Device::open() の URIに、上記で記録したファイル名を指定するだけです。そのほかのコードの変更は一切必要ありません。