Калибровка широкоугольных объективов с помощью Opencv
Я использую широкоугольный объектив (178º Diagonal FOV) и пытаюсь правильно откалибровать его с помощью модуля калибровки Opencv. Все процессы обнаружения и калибровки работают нормально, но результат очень плохой.
Я пробовал много разных конфигураций:
- Различный набор изображений
- Различные числа радиальных коэффициентов: 2,3,4,5 и 6.(CV_CALIB_FIX_K1,...,CV_CALIB_FIX_K6)
- Фиксация главной точки и тангенциального искажения до 0 (CV_CALIB_FIX_ASPECT_RATIO, CV_CALIB_FIX_PRINCIPAL_POINT)
- Использование ожидаемого фокусного расстояния в качестве исходной матрицы камеры. (CV_CALIB_USE_INTRINSIC_GUESS)
Лучшее, что я могу получить, это что-то вроде:
Любые идеи о том, как я могу получить хорошую калибровку? Как вы думаете, используя два калибровочных шаблона одновременно или круговую сетку, как калибровочный шаблон поможет?
Я видел в opencv 3.0 тонкие призматические коэффициенты. Я не пробовал, но не думаю, что это что-то изменит, верно? Редактировать: проверил это... ничего
6 ответов
Начиная с Opencv 2.4.10 и выше, существует специальная модель искажения для широкоугольных объективов / объективов "рыбий глаз", способных справиться с этим сильным радиальным искажением. Я проверил свои наборы данных, и результаты очень хорошие.
Линзы "рыбий глаз" имеют различное моделирование искажений. Для калибровки камеры "рыбий глаз" используйте модуль "рыбий глаз" opencv. Смотрите opnecv документы.
Вы уверены, что используете CV_CALIB_RATIONAL_MODEL
флаг? Это скажет OpenCV использовать модель, которая поддерживает широкоугольные объективы.
Вот мои предложения для объектива 150 градусов. Вы также можете попробовать Апрель Кэл, с которым мне повезло.
Возможно, модель камеры / объектива OpenCV недостаточно точно описывает ваш ультра широкоугольный объектив. И поэтому, возможно, вам придется отказаться от встроенной процедуры калибровки OpenCV и написать собственную процедуру калибровки.
Например, поиск в Google дает мне:
Аннотация: Мы представляем новый метод калибровки сверхширокоугольных камер с "рыбьим глазом", накладывая ограничение на то, чтобы коллинеарные точки были выпрямлены как коллинеарные, параллельные линии были параллельными, а ортогональные линии были ортогональными. Используя тот факт, что подгонка линий сводится к проблеме собственных значений в 3D, мы проводим тщательный анализ возмущений, чтобы получить практическую процедуру калибровки. Проводя эксперименты, мы указываем, что ложные решения существуют, если применяются только коллинеарность и параллелизм. Наша техника имеет много желательных свойств. Например, не требуется никакой метрической информации об эталонном шаблоне или положении камеры, и отдельные шаблоны полос могут отображаться на видеоэкране для создания виртуальной сетки, исключая обработку извлечения точек сетки.
У меня нет опыта работы с линзами типа "рыбий глаз", но если вы планируете сопоставить изображение с перспективной проекцией, у вас возникнут проблемы. Части изображения с большим углом обзора будут отображаться на очень большие расстояния на плоскости изображения. Это может фактически привести к изображению, подобному тому, которое вы предоставили. Определенно, есть некоторые ошибки, но кажется, что большинство прямых "мировых линий" отображаются на прямые "линии изображений".
Что именно вы ожидали в результате и для чего планируете использовать эту калибровку?
OpenCV 2.4.10 и выше имеют модуль калибровки камеры "рыбий глаз". Но этот модуль использует метод, основанный на модели камеры с точечным отверстием. В этой модели у нас есть угол между оптической осью камеры и лучом света от какого-либо объекта перед камерой. У нас также есть угол между оптической осью и направлением, чтобы указать на неискаженное изображение (соответствующее объекту). Если калибровка была выполнена правильно, эти 2 угла будут равны. Это означает, что если угол обзора вашей камеры составляет около 180 градусов, расстояние от центра неискаженного изображения до края неискаженного изображения будет равно бесконечности. В результате модуль коррекции "рыбий глаз" OpenCV (cv::fisheye) не деформирует только центральную часть изображения. В моих собственных результатах я получил 140-150 градусов FOV в неискаженном изображении. Более подробное объяснение я разместил ЗДЕСЬ. Если FOV около 140-150 градусов подходит для вас, вы можете использовать cv:: fisheye без каких-либо изменений