2011-04-04 3 views
6

Я пытаюсь написать код, который будет вычислять фундаментальную матрицу, чтобы определить взаимосвязь между стерео изображениями. Я начал с книг Хартли и Зиссермана, которые большинство людей рекомендует, но у него не было практических примеров, а пример кода для него был в MATLAB, которого у меня нет. Затем я переключился на An introduction to 3D Computer Vision Techniques and Algorithms, что более практично и имеет в нем фактические примеры. Я реализовал рекомендуемый 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.

+0

Вы начали с нормализованных точек из вашего набора данных или с исходными точками, чтобы добраться до двух фундаментальных матриц выше? –

ответ

5

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

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

+0

Я знал, что это будет что-то глупое, что я пропустил. Спасибо за помощь. – SigmaXiPi

Смежные вопросы