Как рассчитать фундаментальную матрицу для стереозрения - PullRequest
7 голосов
/ 04 апреля 2011

Я пытаюсь написать некоторый код, который будет вычислять основную матрицу для определения взаимосвязи между стереоизображениями. Я начал с книги Хартли и Циссермана, которую рекомендует большинство людей, но у нее не было практических примеров, и пример кода для нее был в MATLAB, которого у меня нет. Затем я переключился на Введение в методики и алгоритмы компьютерного зрения 3D , которое является более практичным и содержит реальные примеры. Я реализовал рекомендованный 8-точечный алгоритм, используя Python и numpy, но у меня возникают проблемы с проверкой его правильности.

Я использую набор данных, указанный на стр. 48 (воспользуйтесь этой ссылкой выше, чтобы увидеть отрывок из Google Книг) этой книги. Когда я нормализую баллы, я получаю те же результаты, что и эта книга. Однако, когда я использую функцию SVD numpy для вычисления фундаментальной матрицы, я получаю следующее значение для F:

[[-0.01851684 -0.21631176 -0.67036356]
 [ 0.2605251  -0.01023853  0.14234079]
 [ 0.63748775 -0.09404508 -0.00220713]]

Эта матрица удовлетворяет уравнению p_R ^ * F * p_L = 0 , поэтому она кажется правильной. Однако это сильно отличается от матрицы, рассчитанной в книге. Я попытался дважды проверить ответ, используя cv.FindFundamentalMat () OpenCV, и я получил третий ответ:

[[  22.98129082  271.46453857  853.74273682]
 [-334.1673584    -4.84123087 -175.99523926]
 [-809.88891602  125.99833679    1.        ]]

Я не так рассчитываю эти две другие матрицы, но я не могу найти в сети примеров вычисления фундаментальных матриц, чтобы проверить мою реализацию 8-точечного алгоритма. Тот факт, что моя реализация возвращает значение, которое удовлетворяет уравнению, вселяет в меня уверенность, но я беспокоюсь, что сделал что-то глупое, поэтому я не могу сопоставить результаты в книге или с OpenCV.

1 Ответ

6 голосов
/ 07 апреля 2011

Обратите внимание, что фундаментальная матрица определяется с точностью до постоянного множителя (это можно легко проверить, проверив эпиполярное ограничение). Попробуйте умножить матрицу OpenCV на -8.0574e-04, и вы увидите, что в итоге две матрицы очень похожи: -)

Таким образом, ваш результат, вероятно, в порядке. Небольшое различие между результатами, вероятно, связано с тем, что OpenCV использует другой (возможно, более надежный) подход, чем 8-точечный алгоритм.

...