Калибровка "рыбий глаз" / широкоугольный объектив в OpenCV

Я знаю, что стандартные системы калибровки OpenCV моделируют камеру Pinhole, но я работаю с системой, использующей чрезвычайно широкий объектив FOV (187 градусов). Есть ли какой-нибудь способ сделать это в OpenCV или работать только с широкими объективами? Или мне нужно будет переписать всю калибровку / удаление для моей системы?

4 ответа

Решение

Кажется, нет хорошего способа OpenCV сделать это.

Я использовал OCamLib, чтобы выполнить фактическую калибровку, а затем написал свою собственную функцию "unistortPoints" (используя алгоритмы Скарамуззы), чтобы неискажать точки 2D-изображения в единичные 3D-векторы (а не 2D-точки). К сожалению, это также ломает множество других вещей в OpenCV, потому что большинство функций обработки изображений OpenCV ожидают 2D-точки и свою собственную модель калибровки точечного отверстия, поэтому мне пришлось перестроить существенные части кода для этого.

Я приветствую любое другое понимание этого.

Есть веская причина, по которой люди не используют широкоугольные объективы - когда изображения не искажены, получающееся изображение сильно не прямоугольное, а качество по краям настолько плохое, что изображение нужно обрезать до… 90 градусов FOV. Итак, вопрос в том, почему бы не использовать объектив 90 ° FOV. Ситуация становится еще хуже со стереокамерами и выпрямлением изображения.

Если вам действительно нужно иметь широкое поле зрения, используйте несколько камер или вращающуюся камеру. Вот несколько примеров: PointGrey Inc.

Для калибровки камеры с чрезвычайно широким объективом FOV вы можете использовать модуль всенаправленной камеры от OpenCV Contrib. Важно заметить, что вы должны перестроить свой OpenCV с использованием компонентов OpenCV, чтобы использовать его.

В модуле калибровки камеры "рыбий глаз" OpenCV используется метод, основанный на модели камеры с точечным отверстием. В этой модели у нас есть угол между оптической осью камеры и лучом света от какого-либо объекта перед камерой. У нас также есть угол между оптической осью и направлением, чтобы указать на неискаженное изображение (соответствующее объекту). Если калибровка была выполнена правильно, эти 2 угла будут равны. Это означает, что если угол обзора вашей камеры составляет около 180 градусов, расстояние от центра неискаженного изображения до края неискаженного изображения будет равно бесконечности. В результате модуль коррекции "рыбий глаз" OpenCV (cv::fisheye) не деформирует только центральную часть изображения. Более подробное объяснение этого ограничения я разместил ЗДЕСЬ. В моих собственных результатах я получил 140-150 градусов FOV на неискаженном изображении. Если FOV около 140-150 градусов подходит для вас, вы можете использовать cv:: fisheye без каких-либо изменений

Другие вопросы по тегам