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

9
我正在使用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个回答

5
问题在于cvGetImage的输出是16位深度,而canny需要8位深度,因此我需要将其转换为8位深度,类似于以下内容:
cvConvertScale(depthMetersMat, kinectDepthImage8, 1.0/256.0, 0);

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);

0

验证下面的链接代码...可能会给您有价值的信息。注意:这不是我的代码,但可能会给出您需要的结果。请注释掉//cvCvtColor(rgbimg,rgbimg,CV_RGB2BGR);

http://pastebin.com/e5kHzs84

敬礼, Nagaraju


0

sizeof(XnDepthPixel)是多少?

尝试使用cvCreateImageHeader,然后使用XnDepth图像对其进行cvSetData


问题在于cvGetImage的输出是16位深度,而canny需要8位深度,因此我需要将其转换为8位深度,类似于: - Dr Sokoban
只需按照我说的使用IPL_DEPTH_16U创建图像头,这比转换整个矩阵要快,特别是如果矩阵很大。我现在也想黑进Kinect :D - fabrizioM
很抱歉,我对opencv还不熟悉,所以不知道如何使用您的想法。为什么我需要图像头和cvSetData? - Dr Sokoban
因此,您可以在Opencv内使用Kinect驱动程序分配的相同内存。您可以发现,复制2D矩阵并不真的便宜。图像头提供了他正在查看的矩阵类型的规范,SetData将指针设置为图像头结构内部的实际矩阵。 - fabrizioM

0

如果你正在使用OpenNI,你是否已经创建了上下文、生产节点并开始生成数据?很可能这就是你的问题所在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接