我正在执行以下操作:

cv::Mat E = cv::findEssentialMat(points1, points2, camera_matrix, cv::RANSAC, 0.99899999, 5);
cv::Mat F = cv::findFundamentalMat(points1, points2, cv::RANSAC, 5);
cv::Mat F_from_E = camera_matrix * E * camera_matrix.t();
F_from_E /= F_from_E.at<double>(2,2);

F&F_from_E是否应该相同(至少直到Epsilon)?我得到的结果完全不同..怎么了?

F =
[7.04979698183469e-06, 0.002432250773974527, -0.4123240414255413;
 -0.002437356457829931, 4.279234351782832e-06, 0.3213949830418951;
 0.4106037007903602, -0.3267400404863846, 1]

F_from_E =
[-133309825.1056604, -12617730813.88055, -11410224.97616318;
 12698132835.10022, 119029809.7687021, 13590317.66456599;
 11626592.7208607, -13823099.15009778, 1]

编辑:
经过灰校正后,结果为:

F =
[5.494144599344668e-06, -0.01010565201781491, 2.173842730409767;
 0.01010172737524295, -7.667916254208621e-06, -1.181814974265482;
 -2.203133830194272, 1.194874769481667, 1]

F_from_E =
[-6.410384678315267e-07, -8.58589149223806e-06, -0.02103152462240218;
 1.083579227018603e-05, 8.579623497296189e-06, 0.1309687000241576;
 0.02137235887504683, -0.1395666233886129, 1]

最佳答案

我认为您的代码中F_from_E应该是

F_from_E= camera_matrix.inv().t() * E * camera_matrix.inv()

这可以解释为什么计算的F_from_E中的元素数量会爆炸。

编辑:

按照上述建议对代码进行更正后,由于您使用的是RANSAC,因此结果仍然自然会有所不同。根据匹配的质量和最大的迭代次数,您可能会有细微到显着的差异。由于RANSAC会随机采样匹配并保留具有更多常值的结果,因此通常不太可能在两次不同的运行结束时返回相同的结果。但是,除非您的数据中有太多杂波或问题不适当,否则这些解决方案都将同样好地满足多 View 约束(达到某些epsilon)。

在您的情况下,您将使用第一个RANSAC计算E,并使用第二个RANSAC计算F。因此F_from_EF数值上的差异是很自然的,尽管我几乎可以确定,如果比较它们在数据上的错误(例如通过x_1*F*x_2x_1*F_from_E*x_2),您会发现它们几乎是等效的。

09-06 07:28