読者です 読者をやめる 読者になる 読者になる

Natural Software

KinectなどのDepthセンサーを中心に活動しています

OpenNI2(Beta) 入門(5) :接続されているデバイスをすべて利用する

OpenNI2入門

前回のOpenNI2(Beta) 入門(4) :接続されているデバイスを列挙するでコンピューターに接続されているすべてのデバイスを列挙できました。今回は、この接続情報から、デバイスを起動する方法を載せます。

#include <OpenNI.h>

#include <opencv2\opencv.hpp>

#include <vector>

class DepthSensor

{

private:

openni::Device device;

openni::VideoStream colorStream;

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

cv::Mat colorImage;

public:

DepthSensor()

{

}

void open( const char* uri )

{

auto ret = device.open( uri );

if ( ret != openni::STATUS_OK ) {

throw std::runtime_error( "" );

}

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

colorStream.start();

streams.push_back( &colorStream );

}

void run()

{

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( device.getDeviceInfo().getName(), colorImage );

}

}

}

};

void main()

{

try {

openni::OpenNI::initialize();

openni::Array<openni::DeviceInfo> deviceInfoList;

openni::OpenNI::enumerateDevices( &deviceInfoList );

std::cout << deviceInfoList.getSize() << std::endl;

DepthSensor* sensor = new DepthSensor[deviceInfoList.getSize()];

for ( int i = 0; i < deviceInfoList.getSize(); ++i ) {

std::cout << deviceInfoList[i].getName() << ", "

<< deviceInfoList[i].getVendor() << ", "

<< deviceInfoList[i].getUri() << ", "

<< std::endl;

sensor[i].open( deviceInfoList[i].getUri() );

}

while ( 1 ) {

for ( int i = 0; i < deviceInfoList.getSize(); ++i ) {

sensor[i].run();

}

int key = cv::waitKey( 10 );

if ( key == 'q' ) {

break;

}

}

delete[] sensor;

}

catch ( std::exception& ) {

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

}

}

流れは、デバイスを列挙してから、Colorカメラの表示につなげているだけになります。

前述の通り、デバイスを開くopenni::Device::open()に取得したURIを指定しています。これで、接続されている対応デバイス(ここではKienctとXtion)を同時に、同じコードで利用できるようになります。