【发布时间】: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 点云。也许从这些点我可以映射回正确的像素颜色