我正在尝试计算左右图像中的视差(像素差异)。 假设图像被整流(行对齐)并且主要点已知并且表示为cx,cy(注意左右相机的原理点不同)。
假设我们在左图像中有一个像素x_l在右图像x_r中具有相应的像素。 如果我们使用原点为cx和cy的图像坐标,那么两个像素的视差就像:disp = x_l - x_r
但是,如果图像坐标位于图像的左上角(即在OpenCV中定义),在计算视差时是否需要考虑此偏移(cx)?或者我仍然可以使用disp = x_l - x_r来获得正确的差异吗?
这似乎有点愚蠢的问题,但我确实感到困惑。 感谢。
答案 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
因此,您可以选择根据自己的喜好计算差异,只要在使用差异计算深度时考虑两个不同的原则点即可。