2012年11月16日金曜日

DepthSense SDKで距離画像を取得,OpenCVで表示

SoftkineticのDepthSense SDKで,DS325からの距離画像をOpenCVのMat(CV_16SC1)に放り込み, 100mmで色相が一周するように擬似カラー化して表示する.
void onNewDepthSample(DepthNode node, DepthNode::NewSampleReceivedData data)
{
    int32_t w, h;
    FrameFormat_toResolution(data.captureConfiguration.frameFormat,&w,&h);

	if ( data.depthMap != nullptr ) {
        Mat depth( h, w, CV_16SC1, (void*)(const int16_t*)data.depthMap );
		Mat hsv( h, w, CV_8UC3);
		Mat psCol( h, w, CV_8UC3);

		namedWindow("color depth", 0);
		short level;
		for(int y=0; y<h; y++) {
			for(int x=0; x<w; x++) {
				level = depth.at<short>(y, x);
				if(level > 32000) { //invalid
			        hsv.data[y * hsv.step + x*3 + 0] = 0;
				    hsv.data[y * hsv.step + x*3 + 1] = 0;
				    hsv.data[y * hsv.step + x*3 + 2] = 0;
				} else {
					uchar p = level%100;
					hsv.data[y * depth8u.step + x*3 + 0] = (uchar)(p*2.56);
					hsv.data[y * depth8u.step + x*3 + 1] = 255;
					hsv.data[y * depth8u.step + x*3 + 2] = 255;
				}
			}
		}
		cvtColor(hsv, psCol, CV_HSV2BGR_FULL);
		imshow("color depth", psCol);
        int c = waitKey( 10 );
		if(c==27 || c=='q') g_context.quit();
		if(c=='c') imwrite("DS325.png", psCol);
    }
	g_dFrames++;
}