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

基本上我想将精明和拉普拉斯应用于深度图像。

4

5 回答 5

5

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

cvConvertScale(depthMetersMat, kinectDepthImage8, 1.0/256.0, 0);
于 2011-04-02T17:49:47.437 回答
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);
于 2012-05-19T17:35:40.380 回答
0

sizeof(XnDepthPixel) 是多少?

尝试使用cvCreateImageHeader,然后使用XnDepth Image 在其上执行 cvSetData

于 2011-04-02T09:05:12.910 回答
0

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

http://pastebin.com/e5kHzs84

问候长良州

于 2011-04-20T07:17:12.710 回答
0

如果您使用的是 OpenNI,您是否创建了上下文、生产节点并开始生成数据?应该是你的问题。。

于 2012-07-12T15:29:57.403 回答