Kinect和Opencv,深度图像,如何使用它

时间:2011-04-01 22:50:52

标签: c++ visual-c++ opencv kinect

我使用的是Kinect和OpenCV(我正在使用c ++)。我可以同时获得RGB和深度图像。 使用RGB图像,我可以像往常一样“播放”,模糊它,使用canny(将其转换为灰度),但我不能对深度图像做同样的事情。每次我想用深度图像做某事我都有例外。

我有以下代码来获取深度图像:

CvMat* depthMetersMat = cvCreateMat(480, 640, CV_16UC1 ); 
CvMat* imageMetersMat = cvCreateMat(480, 640, CV_16UC1 );
IplImage *kinectDepthImage = cvCreateImage( cvSize(640,480),16,1); 

const XnDepthPixel* pDepthMap = depth.GetDepthMap();

for (int y=0; y<XN_VGA_Y_RES; y++){ 
            for(int x=0;x<XN_VGA_X_RES;x++){ 
                depthMetersMat->data.s[y * XN_VGA_X_RES + x ] = 10 * pDepthMap[y * XN_VGA_X_RES + x]; 
          }
}

cvGetImage(depthMetersMat, kinectDepthImage);

问题是我无法对kinectDepthImage做任何事情。我试图将它转换为灰度,然后使用canny,但我不知道如何转换它。

基本上我想将canny和laplacian应用于深度图像。

5 个答案:

答案 0 :(得分:5)

问题是cvGetImage的输出是16位深度,而canny需要8位,因此我需要将其转换为8位,如:

cvConvertScale(depthMetersMat, kinectDepthImage8, 1.0/256.0, 0);

答案 1 :(得分:3)

新的OpenCV Api鼓励使用Mat而不是旧的图像类型。在OpenCV中使用OpenNI深度元数据的当前代码是:

Mat depthMat16UC1(width, height, CV_16UC1, (void*) g_DepthMD.Data()); 
Mat depthMat8UC1;
depthMat16UC1.convertTo(depthMat8UC1, CV_8U, 1.0/256.0);

答案 2 :(得分:0)

(深度像素)的大小是多少?

尝试使用 cv CreateImageHeader ,然后使用XnDepth图像对其执行 cvSetData

答案 3 :(得分:0)

验证以下链接代码...可以为您提供有价值的信息。注意:它不是我的代码,可能会给出您需要的结果。评论// cvCvtColor(rgbimg,rgbimg,CV_RGB2BGR);

http://pastebin.com/e5kHzs84

此致 Nagaraju

答案 4 :(得分:0)

如果您正在使用OpenNI,您是否创建了上下文,生产节点并开始生成数据?可能那是你的问题..