2011-04-01 111 views
9

我已经使用Kinect和OpenCV(我正在使用C++)。我可以同时获得RGB和深度图像。 对于RGB图像,我可以像往常一样“播放”,使用Canny(将其转换为灰度后)模糊它,...但我无法对深度图像进行同样的操作。每次我想用深度图像做一些事情时,我都会遇到异常情况。Kinect和Opencv,深度图像,如何使用它

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

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,但我不知道如何转换它。

基本上我想申请坎尼和l​​aplacian深度图像。

回答

5

的问题是,从cvGetImage输出为16位深度,而精明的需要8位,因此我需要将其转换为8位,类似于:

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

内的实际矩阵的指针,如果这是问题的答案,请将其标记为“接受”(点击勾号图标)。 – Spudley 2011-10-15 19:09:58

0

sizeof(XnDepthPixel)是什么?

尝试使用cvCreateImageHeader,然后做cvSetData它与XnDepth图片

+0

问题是,cvGetImage的输出是16位深度,而canny需要8位,因此我需要将它转换为8位,如: – 2011-04-02 17:38:54

+0

只是创建一个图像标题,正如我说的IPL_DEPTH_16U,它将比转换整个矩阵更快,特别是如果很大。我也想现在破解一个kinect:D – fabrizioM 2011-04-02 19:13:57

+0

我很抱歉,我是新的opencv,所以我不知道如何使用你的想法。为什么我需要图像头和cvSetData? – 2011-04-05 12:50:00

0

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

http://pastebin.com/e5kHzs84

问候 Nagaraju

3

新的OpenCV阿比encurages使用垫代替旧的图像类型。使用OpenNI深度元数据中的OpenCV是当前的代码:

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

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