【问题标题】:How to get the corresponding pixel color of disparity map coordinate如何获取视差图坐标对应的像素颜色
【发布时间】:2019-09-18 07:34:06
【问题描述】:

我目前正在处理一项任务,包括相机校准、立体校准,最后是立体匹配。为此,我可以使用可用的 OpenCV 示例和教程,并根据我们的需要进行调整。 虽然前两部分问题不大,但关于立体匹配部分的问题:

我们应该从两个提供的图像的视差图中创建一个 .ply 格式的彩色点云。 我将此代码用作模板: https://github.com/opencv/opencv/blob/master/samples/cpp/stereo_match.cpp 我从作业的前两部分得到内在和外在文件。

我的问题是,如何从原始图像和视差图中得到每个 3D 点对应的颜色?

我猜测视差图的每个坐标对应于两个输入图像共享的一个像素。但是如何获取这些像素值呢?

编辑:我知道视差图每个元素的值代表左右图像对应像素的视差。但是如何从视差图的坐标中得到对应的像素呢? 例子: 我在坐标 (x, y) 处的视差值为 128。128 表示深度。但是我怎么知道这对应于原始左图或右图中的哪个像素呢?

其他问题 我对 StereoSGBM 以及哪些参数有意义还有其他问题。 这是我的(为上传而缩小的)输入图像:

左:

这给了我这些修正后的图像:

从这里我得到这个视差图像:

对于视差图像:这是我使用 blocksize=3 和 numDisparities=512 可以获得的最佳结果。但是,我完全不确定这些参数是否有意义。这些价值观合理吗?

【问题讨论】:

  • Example: my disparity value at coordinates (x, y) is 128. 128 represents the depth. 这是不正确的。深度与视差成反比。您必须进行另一组计算才能从从 opencv 获得的视差图中获得深度。您正在寻找的匹配像素位置通常不会在我使用过的任何 API 中公开。请阅读 Hirshmueller 撰写的半全局匹配论文,以更好地了解匹配实际是如何发生的。
  • 如果深度与视差成反比,那么是的,视差代表深度,不是吗。无论如何,这句话的重点是澄清我对实际视差值不感兴趣,而是坐标以及它们如何对应于初始左右图像的像素。
  • 深度和视差是不同的概念,不能互换。可以完全基于图像源计算相同尺寸图像的视差。但是深度计算需要额外的参数,例如两个相机之间的距离和焦距。正如我之前提到的,我不相信大多数为您进行视差计算的开源 api 会公开匹配的像素信息。
  • 啊,好吧,也许我在这里走错了路。如前所述,下一步是计算 3D 点云。也许从这些点我可以映射回正确的像素颜色

标签: c++ opencv


【解决方案1】:

我的问题是,如何从原始图像和视差图中得到每个 3D 点对应的颜色?

因此,视差图只不过是左右图像中核平面中匹配像素之间的距离。这意味着,您只需要像素强度来计算视差,这反过来意味着,您可以仅对灰度左右图像或左右图像的任何通道进行此计算。

我很确定您正在计算的视差图像在从原始 rgb 图像获得的灰度图像上运行。如果要计算颜色视差图像,只需提取左右图像的各个颜色通道,并计算出对应的视差图通道即可。结果将是一个 3 通道视差图。

其他问题 我还有关于 StereoSGBM 以及哪些参数有意义的问题。这是我的(为上传而缩小的)输入图像:

对于最一般的情况,从来没有一个好的答案。为此,您需要一个参数调谐器。以https://github.com/guimeira/stereo-tuner 为例。如果你愿意,你应该可以很容易地在 open cv 中编写你自己的。

【讨论】:

  • 关于第一个答案:我想我的问题表述不当。我会编辑它,希望编辑后更清楚。关于第二个答案:好的,到目前为止我的代码已经完成,所以我想我可以使用不同的参数。
【解决方案2】:

好的,这个问题的解决方案是使用 OpenCV 中的 projectpoint() 函数。 基本上从视差图像计算 3D 点并将它们投影到 2D 图像上并使用您点击的颜色。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-09
    • 2021-12-13
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多