Kinect和Opencv,深度图,怎么用
Posted
技术标签:
【中文标题】Kinect和Opencv,深度图,怎么用【英文标题】:Kinect and Opencv, the depth image, how to use it 【发布时间】:2011-04-01 22:50:51 【问题描述】:我使用的是 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 应用于深度图像。
【问题讨论】:
【参考方案1】:问题是 cvGetImage 的输出是 16 位深度,而 canny 需要 8 位,因此我需要将其转换为 8 位,例如:
cvConvertScale(depthMetersMat, kinectDepthImage8, 1.0/256.0, 0);
【讨论】:
【参考方案2】:新的 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);
【讨论】:
【参考方案3】:sizeof(XnDepthPixel) 是多少?
尝试使用 cvCreateImageHeader,然后使用 XnDepth Image 对其执行 cvSetData
【讨论】:
问题是 cvGetImage 的输出是 16 位深度,而 canny 需要 8 位,因此我需要将其转换为 8 位,例如: 就像我用 IPL_DEPTH_16U 说的那样创建一个图像标题,它会比转换整个矩阵更快,特别是如果它很大。我现在也想破解 kinect :D 对不起,我是opencv的新手,所以我不知道如何使用你的想法。为什么我需要图像标题和 cvSetData? 因此您可以在 Opencv 内部使用 Kinect 驱动程序分配的 SAME 内存。您可以理解复制 2D 矩阵并不便宜。图像 Header 给出了他正在查看的矩阵类型的规范,SetData 将指针设置为指向图像标题结构内的实际矩阵【参考方案4】:验证下面的链接代码...可以为您提供有价值的信息。注意:它不是我的代码,可能会给出您需要的结果。注释 //cvCvtColor(rgbimg,rgbimg,CV_RGB2BGR);
http://pastebin.com/e5kHzs84
问候 长良州
【讨论】:
【参考方案5】:如果您使用的是 OpenNI,您是否已创建上下文、生产节点并开始生成数据?可能是你的问题..
【讨论】:
以上是关于Kinect和Opencv,深度图,怎么用的主要内容,如果未能解决你的问题,请参考以下文章
C++ OpenCV 2.4.0 findContours 因 Kinect 深度流而崩溃
ubuntu 14.04 +Kinect+ openNI+ openCV+ Sensorkinect 配置 +获取深度图像及相关问题