Я знаю, что система калибровки по умолчанию для OpenCV моделирует камеру Пинхол, но я работаю с системой, использующей чрезвычайно широкий объектив FOV (187 градусов). Если есть какой-либо существующий способ сделать это в OpenCV или работать с широкими объективами? Или мне придется переписать всю калибровку/неискаствование для моей системы?
Калибровка оптических линз/широкоугольных объективов в OpenCV
Ответ 1
Кажется, нет хорошего способа OpenCV для этого.
Я закончил работу с OCamLib, чтобы выполнить фактическую калибровку, а затем написал собственную функцию "undistortPoints" (используя алгоритмы Scaramuzza), чтобы исказить точки 2D-изображения в 3D-векторах (а не в 2D-точках). К сожалению, это также ломает много других вещей в OpenCV, потому что большинство функций обработки изображений OpenCV ожидают 2D-точки и собственную модель калибровки обскуры, поэтому мне пришлось перестроить значительную часть кода для этого.
Я приветствую любое другое понимание этого.
Ответ 2
Есть веская причина, почему люди не используют широкоугольные объективы много - когда изображения неискаженные, результирующее изображение сильно не прямоугольное, а качество на краях настолько плохо, что изображение нужно обрезать назад... 90 deg FOV. Итак, вопрос в том, почему просто не использовать 90-градусный FOV-объектив на первом месте? Ситуация ухудшается с помощью стереокамер и исправления изображения.
Если вам действительно нужно иметь широкое поле зрения, используйте несколько камер или вращающуюся камеру. Вот несколько примеров: PointGrey Inc.
Ответ 3
Для калибровки камеры с чрезвычайно широким объективом FOV вы можете использовать всенаправленный модуль камеры из OpenCV Contrib. Важно заметить, что вам нужно перестроить OpenCV с помощью вкладок OpenCV, чтобы использовать его.
Ответ 4
В калибровочном модуле камеры OpenSV Fisheye используется метод, основанный на модели камеры с отверстиями. В этой модели мы имеем угол между оптической осью камеры и лучом света от какого-либо объекта перед камерой. У нас также есть угол между оптической осью и направлением к точке на неискаженное изображение (соответствующее объекту). Если калибровка выполнена правильно, эти 2 угла будут равны. Это означает, что если FOV вашей камеры составляет около 180 градусов, расстояние от центра неискаженного изображения до края неискаженного изображения будет равно бесконечности. В результате модуль коррекции fisheye OpenCV (cv:: fisheye) искажает только центральную часть изображения. В моих собственных результатах я получил 140-150 градусов FOV в неискаженном изображении. Если FOV около 140-150 градусов подходит для вас, вы можете использовать cv:: fisheye без каких-либо изменений.