这主要是一个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);