OpenCV计算图像坐标的差异

时间:2014-09-11 17:09:08

标签: opencv stereo-3d

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

两个校正图像的投影矩阵(坐标原点位于图像的左上角)具有以下形式:

      [ 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

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