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

OpenCV(python)基本矩阵和基本矩阵不一致,python,opencv,computer-vision,camera-calibration,Python,Opencv,Computer Vision,Camera Calibration,我尝试用OpenCV(python接口)校准立体相机。我首先用CalibleCamera2分别校准了两台摄像机,然后将参数输入到stereoCalibrate cv.StereoCalibrate(object_points, image_points_left, image_points_right, \ point_counts, intrinsic_left, distortion_left,\ intrinsic_right,

我尝试用OpenCV(python接口)校准立体相机。我首先用CalibleCamera2分别校准了两台摄像机,然后将参数输入到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。

我建议您参考

但说真的,也许这是点积中的“归一化”现象?标准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矩阵)

StereoCalibrate()返回的E和F矩阵是正确的。F是按比例定义的,因此,如果要将返回的F和根据E计算的F矩阵进行比较,则需要对它们进行规格化,以确保两者处于相同的比例。因此,当您查看它们时,它们看起来是相同的。StereoCalibrate()规范化返回的F,因此您需要规范化计算出的F2,正如您在一条注释中所指出的。我希望这能让您更清楚地了解为什么需要这样做。

我使用的是numpy的点函数,因为我使用numpy数组。实际上,我刚刚发现通过F2/=F2[2,2]缩放F2产生正确的结果。然而,这仍然让我感到困惑,因为根据API,我上面的计算应该是正确的。老实说,我不知道这首歌是如何增加这一点的。我知道基本矩阵是什么,我只是想知道为什么OpenCV会出错。啊,听起来有些矩阵已经/没有标准化。我从来没有我以前在OpenCV上注意到了这一点。我可能会看一看底层的源代码。这首歌只是一个轻松的参考。很抱歉让你更加困惑!啊,好吧。矩阵没有规范化有关系吗?我的意思是,当我进一步使用它时,我会得到错误的结果吗?关于这首歌,我很抱歉反应有点粗糙。我我相信你的意思是轻松愉快。我只是对函数实际计算的内容与API中所述的不同感到恼火。不用担心。当事情与API不同时,这很恼人。我会在空闲时间自己看看。顺便说一句,我的愚蠢错误是没有将上述示例转换为
mat()
矩阵。然后它就等于同样的东西。在上面编辑它。谢谢。我假设你把所有东西都转换成矩阵:)。