Сравнение матрицы F и матрицы E - PullRequest
0 голосов
/ 16 июня 2020

Я делаю следующее:

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]

Изменить: После A sh исправление, результаты:

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]

1 Ответ

1 голос
/ 16 июня 2020

Я думаю, что в вашем коде F_from_E должно быть

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

Это может объяснить, почему величина элементов в вашем вычисленном F_from_E взрывается.

Изменить :

После внесения исправлений в код, как было предложено выше, результаты по-прежнему могут отличаться, поскольку вы используете RANSA C. В зависимости от качества совпадений и максимального количества итераций могут быть незначительные или существенные различия. Поскольку RANSA C случайным образом выбирает совпадения и сохраняет результат с большим количеством промежуточных значений, обычно очень маловероятно, что он вернет тот же результат в конце двух разных прогонов. Однако, если у вас не слишком много шума в ваших данных или если проблема некорректно поставлена, эти решения будут одинаково хорошо удовлетворять ограничениям многовидности (с точностью до некоторого эпсилона).

В вашем случае вы вычисляете E с использованием первого RANSA C и F с использованием второго RANSA C. Таким образом, вполне естественно, что F_from_E и F численно отличаются, хотя я почти уверен, что если вы сравните их ошибку с вашими данными (** например, через x_1*F*x_2 и x_1*F_from_E*x_2), вы увидите, что они в значительной степени эквивалент.

...