Можно ли откалибровать камеру типа "рыбий глаз" с использованием стандартного openCV?
Я пытаюсь откалибровать камеру с ультра широкоугольным объективом> 180 градусов. Я использую OpenCV 3.2 и код калибровки камеры из opencv/samples/cpp/tutorial_code/calib3d/camera_calibration
, в результате я получаю изображение, похожее на это из этого поста. На youtube.com я нашел множество фильмов, в которых люди показывают, как они калибруют камеры типа "рыбий глаз", например, это видео.
Я знаю, что калибровка сверхширокоугольных камер может быть сложной. Я также обнаружил, что есть еще одна стандартная модель для калибровки камеры "рыбий глаз" в openCV contrib
Можно ли использовать калибровочную модель камеры из стандартного OpenCV для калибровки такой широкоугольной камеры или мне следует использовать другую модель, например, из openCV contrib?
3 ответа
Я работал над той же проблемой несколько недель назад и обнаружил, что стандартная модель не работает с моими изображениями типа "рыбий глаз" ( >180 FOV). Сказав это, я нашел запрос на Github, который решает только эту проблему - https://github.com/opencv/opencv/pull/6801.
В конце концов я отказался от стандартной модели и просто использовал всенаправленную модель - http://docs.opencv.org/trunk/dd/d12/tutorial_omnidir_calib_main.html которая работала как шарм.
В качестве дополнительного примечания, когда я исследовал тему коррекции искажений, я натолкнулся на распространенное заблуждение о том, что изображения "рыбий глаз", полученные с помощью линз "рыбий глаз", "искажены", в действительности они могут быть искажены, но полученные изображения являются просто проекцией. Рыбий глаз, как и другие проекции, является одним из многих способов отображения трехмерного мира на двухмерной плоскости. Это не помогает, что большинство связанной литературы называют это "искажением". Линзы "рыбий глаз" специально предназначены для получения изображений с изогнутыми линиями, когда эти линии были бы прямыми со стандартными (то есть прямолинейными) линзами. Слово "искажение" зарезервировано исключительно для геометрических аберраций, которые негативно влияют на стандартные (то есть прямолинейные) линзы.
В моем случае, несмотря на то, что я искал исправление искажения, я не заканчивал тем, что исправлял любое искажение, я просто сделал "рыбий глаз" на перспективную проекцию - вы можете найти больше об этом здесь http://paulbourke.net/dome/fish2/
Кроме того, в отношении захвата изображений шахматной доски следуйте этим рекомендациям - Как проверить правильность калибровки веб-камеры?
Я решил эту проблему для камеры FOV "рыбий глаз" на 180 градусов через модуль cv:: fisheye из Open CV 3.4.0. (C++, MS Windows).
Я использовал cv::fisheye::calibrate, чтобы сделать K и D (матрица камеры и матрица коэффициентов радиального искажения). Затем я использовал cv::fisheye::initUndistortRectifyMap для создания карт для координат X и Y. И, наконец, я использовал cv:: remap, чтобы удалить изображение с камеры "рыбий глаз" через карты из initUndistortRectifyMap. Это решение имеет некоторые ограничения (OpenCV разархивирует только центральную часть изображения "рыбий глаз". Края перемещаются наружу). В результате вы получите 140-150 FOV. Подробное объяснение этого ограничения я разместил ЗДЕСЬ. Если 140-150 градусов FOV подходит для вас, вы можете использовать этот модуль без каких-либо модификаций
Существуют специальные функции калибровки для калибровки "рыбий глаз": см. http://docs.opencv.org/trunk/db/d58/group__calib3d__fisheye.html
Убедитесь, что вы получаете изображения в границах изображения с различными позами и расстояниями до камеры для хорошей калибровки. Адаптируйте пример калибровки, чтобы использовать функции "рыбий глаз".