1

我已经成功地使用 OpenCV 2.4.5 中的 cv::stereoSGBM 类创建了一个令人满意的视差图,具有 256 个不同的视差级别。如文档中所示,我已将所有视差值除以 16,但此最终地图不可能包含“真实”视差:如果我将 (x, y) 像素的水平维度添加到其计算的视差 (x + d),得到的坐标 (x + d, y) 在另一幅图像中对应一个完全不同的像素。

我猜这个问题源于我最初将stereoSGBM参数化为256个视差级别,但实际的最大视差(以像素为单位)要小得多。由于我真的不知道实际的最大差异,我不能相应地对由 stereoSGBM 计算的值进行归一化。

我需要实际的视差值来计算密集的立体对应(三角测量和 3D 重建所必需的)。

4

2 回答 2

3

我有同样的问题,这就是我解决它的方法:

您的实际(原始)差异是 StereoSGBM 类作为输出给出的。您仅缩放它以便您可以以图像格式查看它。

为了获得左右图像的对应像素,使用StereoSGBM类给出的视差矩阵。这意味着,您不应将其缩放为以图像格式查看。然后您将正确获得相应的积分。

但是在访问这些值时要小心。数据类型是_int16。如果您使用错误的数据类型,您将遇到异常。

这就是您将为对应点所做的事情:假设I1是您的左图像和I2右图像,并且d是某些行i和列的视差值j,那么I1(i,j)I2(i,j-d)将是对应点,假设水平立体。

于 2014-04-11T06:38:05.063 回答
0

我做了一些测试,当您将 SGBM 的输出除以 16 时,会给出真正的差异。在这里,您可以看到 -128 到 128 和 -128 到 256 差异的差异输出的两个直方图:(显示的差异除以16)

-128_128

-128_256

您会看到 -50 和 128 之间的中间区域是等效的。因此 num_disparity 和 min_disparity 的值不会影响 SGBM 的缩放输出。

请注意,视差由所用相机的基线和焦距缩放。因此,如果您使用来自多个立体对图像的多个视差图,则每个视差图都会按该对的基线以及特定焦距使用不同的相机进行缩放。

于 2018-05-04T13:48:30.030 回答