前回の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()
{
}
{
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)を同時に、同じコードで利用できるようになります。