【问题标题】:Given a stereo disparity map in OpenCV, how do I find true pixel offsets between left and right images (per-pixel)?给定 OpenCV 中的立体视差图,如何找到左右图像(每像素)之间的真实像素偏移?
【发布时间】:2013-05-05 08:44:37
【问题描述】:

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

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

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

【问题讨论】:

    标签: opencv stereo-3d disparity-mapping


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,我就是这样解决的:

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

      为了得到左右图像的对应像素点,照原样使用StereoSGBM类给出的视差矩阵。这意味着,您不应将其缩放为以图像格式查看。然后就可以正确获取对应的点数了。

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

      这是您将针对相应点执行的操作: 假设I1是你的左图,I2是你的右图,d是某行i和列j的视差值,那么I1(i,j)I2(i,j-d)将是对应的点,假设水平立体。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-22
        • 1970-01-01
        • 2015-03-11
        • 2023-03-10
        • 2012-10-29
        • 1970-01-01
        • 2022-01-07
        相关资源
        最近更新 更多