前回は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 );
...
}