3

我尝试使用 OpenCV(python 接口)校准立体相机。我首先使用 calibrateCamera2 分别校准了两个摄像头,然后将参数输入到 stereoCalibrate

cv.StereoCalibrate(object_points, image_points_left, image_points_right, \
               point_counts, intrinsic_left, distortion_left,\
               intrinsic_right, distortion_right, \
               (IMGRES_X,IMGRES_Y), R, T, E, F, \
               term_crit=(cv.CV_TERMCRIT_ITER+cv.CV_TERMCRIT_EPS, 100, 1e-8),\
               flags=cv.CV_CALIB_FIX_INTRINSIC)

我使用极线约束检查结果(如 OpenCV 书中所述),得到的平均误差约为 0.0039。

原则上,我应该能够将基本矩阵和基本矩阵与我的相机矩阵联系起来。所以我要做的是:

Mr = asarray(intrinsic_right,dtype=float64)
Ml = asarray(intrinsic_left,dtype=float64)
E = asarray(E)
F = asarray(F)
F2 = dot(dot(inv(Mr).T,E),inv(Ml))

然而,得到的矩阵 F2 一点也不像 F。有什么明显的我做错了吗?非常感谢您的帮助。

编辑: dot 和 inv 来自 numpy。

4

2 回答 2

4

StereoCalibrate() 返回的 E 和 F 矩阵是正确的。F 是按比例定义的,因此如果您要比较返回的 F 和从 E 计算的 F 矩阵,您需要对它们进行归一化以确保两者处于相同的比例。所以当你看它们时,它们看起来是一样的。StereoCalibrate() 标准化返回的 F,因此您需要标准化计算的 F2,正如您在评论之一中所指出的那样。我希望这可以更清楚地说明您为什么需要这样做。

于 2012-05-03T15:13:16.603 回答
0

我向您推荐 The Fundamental Matix Song ...

但说真的,也许它是点积中的“标准化”?标准的 numpydot函数似乎可以正确地将矩阵拆分为单独的行和列向量以进行乘法运算。

例如,如果我这样做:

A = mat(random.rand(3,3))
B = mat(random.rand(3,3))
dot(A,B) == A*B

相反,我想知道它是否有助于执行直接的矩阵乘法:

F2 = np.linalg.inv(Mr.T) * E * np.linalg.inv(Ml)

(注意我在这里使用 numpy 矩阵)

于 2012-04-17T12:51:30.053 回答