【问题标题】:How to get a depth image from sparse depth data?如何从稀疏深度数据中获取深度图像?
【发布时间】:2018-02-17 03:17:32
【问题描述】:

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

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

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

在图像上,您可以看到最亮的(白色)像素对应于具有最大深度的像素。由此,我需要获得更密集的深度图像或类似于适当深度图像的 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);

【问题讨论】:

  • 记住:只有你有数据来测试并让这个意大利面条代码工作。这里 99.9% 的人没有坐在桌子上的 Velodyne 传感器。考虑到这一点,请意识到现在写问题的方式意味着没有人能够帮助您。祝你好运!
  • 在旁注中,我注意到您问了几个问题,但没有为他们选择任何官方答案。似乎其中至少有几个值得选择答案。您可以返回,查看您的问题并单击最能解决这些问题的答案附近的复选框吗?这将为回答他们的人提供一些分数,并帮助我们保持 Stackoverflow 井井有条。将来,有类似问题的人会阅读您的问题并更容易找到最佳答案,如果他们被标记为这样。
  • @karlphillip 你说得对,我编辑了标题以免与 Velodyne 混淆,因为问题可以改写为“如何在稀疏深度 2D 图像上进行插值/外插”。我们在这里只处理一个单通道图像矩阵。至于我之前忽略的问题,我给了他们一个评论,谢谢你提醒我这样做:)
  • 你有seen this吗?蒙版必须比降低原始图像质量的线条更厚/更大。我不认为你这样做是正确的。

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


【解决方案1】:

我通过简单地在稀疏深度图像上使用膨胀来获得所需的输出(类似于深度图像的东西):

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 2019-10-21
    • 2011-11-06
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多