【问题标题】:OpenCV calculate disparity in image coordinateOpenCV计算图像坐标的视差
【发布时间】:2014-11-05 17:57:59
【问题描述】:

我正在尝试计算左右图像中的差异(像素差异)。 假设图像被校正(行对齐)并且主点已知并表示为 cx, cy(注意主点对于左右相机是不同的)。

假设我们在左图像 x_l 中有一个像素,在右图像 x_r 中有相应的像素。 如果我们使用原点为cx和cy的图像坐标,那么两个像素的视差简单为:disp = x_l - x_r

但是,如果图像坐标的原点位于图像的左上角(即在 OpenCV 中定义),在计算视差时是否需要考虑此偏移量 (cx)?还是我仍然可以使用 disp = x_l - x_r 来获得正确的视差?

这似乎是一个有点愚蠢的问题,但我确实感到困惑。 谢谢。

【问题讨论】:

  • 计算两个图像中单个像素的视差不会给出可靠和准确的结果。图像中的一个像素错误可能会导致深度感知出现半米的错误。所以我强烈建议使用来自 opencv 的 BM/SGBM 算法,因为它们基于复杂的算法。如果您知道场景中对象的坐标,您可以将它们作为 ROI(感兴趣区域)提供给 StereoBM 类,以降低计算成本。但是将视差计算为简单的三角测量不会给你准确性。

标签: opencv stereo-3d


【解决方案1】:

这实际上取决于您使用视差计算深度的方式。

两幅校正后的图像(坐标原点在图像左上角)的投影矩阵形式如下:

      [ fx   0  cx_l  0 ]
P_l = [  0  fy    cy  0 ]
      [  0   0     1  0 ]

      [ fx   0  cx_r  -B ]
P_r = [  0  fy    cy   0 ]
      [  0   0     1   0 ]

其中B 是基线,fx 是常见的水平焦距。如果您在两个图像中投影相同的 3D 点 M = [X; Y; Z; 1],您将获得以下关系:

u_l-u_r = fx*B/Z + cx_l-cx_r

P_l*M = Z*[u_l; v; 1]P_r*M = Z*[u_r; v; 1]。这种关系可以重构为

Z = fx * B / (u_l-u_r-cx_l+cx_r)
  = fx * B / (disp_1-cx_l+cx_r)
  = fx * B / disp_2

disp_1 = u_l-u_r
disp_2 = u_l-u_r-cx_l+cx_r

因此,您可以根据自己的喜好选择计算视差,只要在使用视差计算深度时考虑到两个不同的原则点即可。

【讨论】:

  • 只是一个注释,如果使用 OpenCV reprojectImageTo3D() 函数从视差图中获取 3D 点,则应使用 disp_1 作为函数使用的重投影矩阵 Q 已包含 cx_l 和 cx_r 偏移量(学习 OpenCV 书 p435)。
猜你喜欢
  • 1970-01-01
  • 2020-01-26
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
  • 2015-08-10
  • 2012-11-02
  • 1970-01-01
相关资源
最近更新 更多