opencv Mat CV_8UC1 type(uchar)to * unsigned short(* UINT16)

时间:2017-08-21 10:58:15

标签: c++ opencv image-processing kinect

这主要是一个C ++变量/指针处理/转换问题。

我正在尝试将其中一个openCV库图像过滤器应用于Kinect v2 SDK的深度图像(16位灰度,值介于0和8092之间)。

我希望在获得深度图像之后执行此操作,但之前使用kinect SDK进行rgb深度注册并转换为点云。因此,我希望最终过滤的图像/数组与我在过滤之前收到的类型相同,因此我可以将其传递回Kinect SDK。

初始代码:

获取kinect深度帧作为指针

 UINT nBufferSize = nDepthFrameHeight * nDepthFrameWidth;
 hr = pDepthFrame->CopyFrameDataToArray(nBufferSize, pDepth); 

创建2个矩阵以及16位和8位之间的转换(openCV与8位灰度级配合使用)

Mat depthMat(height, width, CV_16UC1, depth); // from kinect
Mat depthf(height, width, CV_8UC1);

depthMat.convertTo(depthf, CV_8UC1, 255.0/2048.0);
imshow("original-depth", depthf);

const unsigned char noDepth = 0; // change to 255, if values no depth uses max value
Mat temp, temp2;

1步 - 缩小性能,使用较小版本的深度图像

 Mat small_depthf; 
    resize(depthf, small_depthf, Size(), 0.2, 0.2);

2步 - 只修复蒙面"未知"像素

 cv::inpaint(small_depthf, (small_depthf == noDepth), temp, 5.0, INPAINT_TELEA);

3步 - 升级到原始尺寸并替换原始深度图像中的修复区域

resize(temp, temp2, depthf.size());
temp2.copyTo(depthf, (depthf == noDepth)); // add to the original signal

imshow("depth-inpaint", depthf); // show results

有问题的部分:

当我试图扭转这个过程时(即使现在丢失了信息)

cv::Mat newDepth(nDepthFrameHeight, nDepthFrameWidth, CV_16UC1);
depthf.convertTo(newDepth, CV_16UC1,  8092.0 / 255.0); 

我发现无法将这些cv :: Mat类型转换回* ushort(在这种情况下为* UINT16)。

我已经尝试过像reinterpret_cast,depthf.data和depthf.ptr()这样的东西,但是当它悬停在最终数据上时它会一直显示uchar,除非我像上面的ptr情况一样强制它,在这种情况下它会崩溃。 有任何想法吗?

P.S。:如果我不尝试过滤深度,代码可以完美运行。此外,当SDK尝试映射颜色和深度并尝试在

中使用pDepth时发生崩溃
    pCoordinateMapper->MapColorFrameToDepthSpace(nDepthFrameWidth * nDepthFrameHeight, pDepth, nColorFrameWidth * nColorFrameHeight, (DepthSpacePoint*)pDepthSpacePoints);

0 个答案:

没有答案