繁体   English   中英

OpenCV(python)基本和基本矩阵不一致

[英]OpenCV (python) fundamental and essential matrix do not agree

我尝试使用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。

StereoCalibrate()返回的E和F矩阵是正确的。 F按比例定义,因此如果您要比较返回的F和从E计算的F矩阵,则需要对它们进行标准化以确保两者具有相同的比例。 所以当你看着它们时,它们看起来是一样的。 StereoCalibrate()规范化返回的F,因此您需要按照您在其中一条注释中记录的规范化计算出的F2。 我希望能更明确地说明为什么需要这样做。

我推荐你到The Fundamental Matix Song ...

但严重的是,也许这是点积中的“正常化”?标准的numpy dot函数似乎正确地将矩阵分解成单独的行和列向量以进行乘法。

例如,如果我这样做:

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矩阵)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM