如何从稀疏深度数据中获取深度图像?

时间:2018-02-17 03:17:33

标签: c++ image opencv image-processing ros

我目前正在研究一个问题,我根据Velodyne数据创建了一个CV_16UC1类型的uint16图像,其中98%的像素是黑色(值0),其余像素都有度量深度信息(距离到那一点)。这些像素对应于云中的velodyne点。

cv::Mat depthMat = cv::Mat::zeros(frame.size(), CV_16UC1);
depthMat = ... //here the matrice is filled

如果我尝试显示此图像,我会得到这个:

enter image description here

在图像上你可以看到最亮(白色)的像素对应于深度最大的像素。从这里我需要得到一个更密集的深度图像或smth,它类似于正确的深度图像,就像在这个例子中所示视频:

https://www.youtube.com/watch?v=4yZ4JGgLE0I

这需要对这些点(2D图像的像素)进行适当的插值和外推,这就是我被卡住的地方。在插值技术方面,我是初学者。有谁知道如何做到这一点,或者至少可以指出我从稀疏数据创建深度图的工作解决方案或示例算法?

我在Kinect示例中尝试了以下内容,但它没有更改输出:

depthMat.convertTo(depthf, CV_8UC1, 255.0/65535);

const unsigned char noDepth = 255;
cv::Mat small_depthf, temp, temp2;
cv::resize(depthf, small_depthf, cv::Size(), 0.01, 0.01);

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

cv::resize(temp, temp2, depthf.size());

temp2.copyTo(depthf, (depthf == noDepth));
cv::imshow("window",depthf);
cv::waitKey(3);

1 个答案:

答案 0 :(得分:0)

我设法通过在稀疏深度图像上使用扩张来获得所需的输出(类似于深度图像的东西):

cv::Mat result;
dilate(depthMat, result, cv::Mat(), cv::Point(-1, -1), 10, 1, 1);