ブログ@kaorun55

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

SoftKinetic の DepthSenseSDK で、DepthMapを表示してみる

前回はDepthSenseSDKの環境構築と、カラーカメラの画像を表示してみました。

今回は、距離カメラのデータを表示してみます。

コードは前回と同様に「ConsoleDemo」を使いました。

DepthMapの表示

さっそく表示処理を書いてみます。Depthデータが更新されると、onNewDepthSample() が呼ばれ、引数で渡される DepthNode::NewSampleReceivedData に更新されたDepthデータが入ってきます。

Depthデータのフォーマットはいくつかありますが、 DepthNode::NewSampleReceivedData::depthMap に16bitのDepthデータが入っているようですので、これを表示してみます。表示方法は、Kinectと同じように16bitの cv::Mat を作るだけです。ビットシフトなどが発生しない分、楽ですね。

void onNewDepthSample(DepthNode node, DepthNode::NewSampleReceivedData data)

{

...

if ( data.depthMap != nullptr ) {

cv::Mat mat( h, w, CV_16SC1, (void*)(const int16_t*)data.depthMap );

cv::imshow( "SoftKinetic Depth Camera", mat );

cv::waitKey( 1 );

}

...

}

DepthMapの有効化

上記のコードを実行しても、実はDepthデータが表示されません。DepthNode::NewSampleReceivedData のデータはそれぞれ個別に有効化する必要があるようです。この設定は configureDepthNode() で行います。ここで depthMap を有効にする g_dnode.setEnableDepthMap( true ); を追加することで、Depthデータが表示されるようになります。

void configureDepthNode()

{

g_dnode.newSampleReceivedEvent().connect(&onNewDepthSample);

DepthNode::Configuration config = g_dnode.getConfiguration();

config.frameFormat = FRAME_FORMAT_QVGA;

config.framerate = 25;

config.mode = DepthNode::CAMERA_MODE_CLOSE_MODE;

config.saturation = true;

g_dnode.setEnableVertices(true);

// この行を追加

g_dnode.setEnableDepthMap( true );

...

}