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に、上記で記録したファイル名を指定するだけです。そのほかのコードの変更は一切必要ありません。