Как стать автором
Обновить

Алгоритм коррекции геометрических искажений, вносимых объективом «рыбий глаз» в изображения и видео

Время на прочтение4 мин
Количество просмотров7.4K
Всего голосов 22: ↑22 и ↓0+22
Комментарии18

Комментарии 18

Часть формул покрашилась :(

Спасибо за статью - крайне актуально для меня. Делаю калькулятор для расчета зон обзора камер видеонаблюдения (мой хомяк) - для камер с дисторсией пока не смог решить вопрос (меня интересует плотность пикселей при удалении от камеры)

С формулами теперь - порядок (удалось таки удачно преобразовать Latex скрипты в растр)!

А в чем проблема?
Делаете undistortion для любого фрейма с камеры. Берете координаты точки в кадре, вычитаете центр фрейма и делите на фокусное расстояние и получаете относительные координаты относительно центра выраженные в фокусном расстоянии.
А теперь все просто: угол до точки равен arctan®, где r = (x,y), а x и y — те самые нормализованные величины, из которых, как я написал выше, вычли cx, cy (оптический сентр, обычно в центре камеры) и поделили на f. Усе!
Хотите обзор камеры по широте? Берете самую левую точку, делаете undistortion, делаете преобразования, которые написал выше и арктангенс даст вам половину угла обзора (ибо относительно центра, а не всей ширины, т.е. половину даст).

Про плотность пикселей аналогично. К сожалению, очень часто геометрические расчеты для камер прячут за очень сложной математикой, хотя на самом деле после undistorion там работает простая геометрия и тригонометрия.

Получается, алгоритмы исправляют изображение, я был уверен, что это больше происходит из-за изменения оптики

У оптики свои достоинства!
Но имеются и недостатки: либо у нас малый угол обзора и неискаженное изображение, либо искаженное изображение с большим углом обзора. И это противоречие для изображений и видео с камер "рыбий глаз" можно решить хоть как-то лишь с помощью цифровой обработки...

Ещё вес и стоимость можно внести в уравнение

А как же Kannala-Brandt?
Не очень понятен, зачем обзор современных методов с упоминанием древнего Brown–Conrady, и при этом не упомянуть классический и один из самых популярных методов для fisheye сегодня.
Всем советую для любых велосипедов сначала пробовать это:
docs.opencv.org/4.5.2/db/d58/group__calib3d__fisheye.html
Куча удобного софта есть для калибровки камеры именно в этом формате:
github.com/ethz-asl/kalibr

В оригинальной статье есть ссылки и на более современные подходы...

В настоящее время, даже нейросети умудряются обучать для решения проблемы.

Что касаемо "https://docs.opencv.org/4.5.2/db/d58/group__calib3d__fisheye.html", так здесь в основе всё та же геометрия и, соответственно, всё те же Brown и Conrady.

На сегодняшний день при исправлении дисторсии все существующие модели, во-первых, "не умеют" сохранять поле зрения с такой полнотой, и, во-вторых, имеют не единственный (R0), а множество настроечных (подгоночных) параметров модели...

Что касаемо «docs.opencv.org/4.5.2/db/d58/group__calib3d__fisheye.html», так здесь в основе всё та же геометрия и, соответственно, всё те же Brown и Conrady.

Нет, неправда. Вы не видите разницу? Вы строите велосипед, сравниваете его с решением, которое было 25 лет назад, и де-факто обходите стандартный на сегодняшний метод подход для fisheye-камер. Я понимаю, что так ваш метод будет выглядить и точнее, и лучше, но это как-то… нечестно, что ли.
На сегодняшний день при исправлении дисторсии все существующие модели, во-первых, «не умеют» сохранять поле зрения с такой полнотой

Что значит «не умеют сохранять поле зрения»? Для любых камер чуть меньше 180 все поле зрения будет сохранено. Для этого нет никаких препятствий. Для камер с углом обзора 180 и более не существует непересекающейся проекции на конечную плоскость с undistortion (т.е. прямые линии в прямые).

Математическая "кухня" - не в счет! В основе то лежит рассмотрение (описание) самой дисторсии через полином, пусть даже и весьма высокой степени...

При сохранении всего исправленного поля зрения "в лоб", у Вас будет либо почти бесконечно большая картинка по количеству пикселей, либо будет потеряна разрешающая способность по всей области чуть дальше внешней границы к центру, если удерживать их количество.

Теория - теорией (проекции и все такое...), а на практике не все так "гладко" и просто, как хотелось бы...

Дело не только в полиноме, но и в том, от чего он берется. Что является аргументом. Ладно…

Советую, ради спорта, вживую реализовать любой из современных алгоритмов для объектива fisheye, охватывающего половину телесного угла (или более) с aspect ratio 1:1, и затем удержать 100% поля зрения при том же выходном размере изображения, что и входное, с уменьшением разрешающей способности по изображению не более, чем в 2 раза!

Получится, - пишите! Обязательно внесу изменения в статью!..

Вот теперь мне более понятно, какую вы задачу решали.
Тем не менее, вопрос мой остается:
Для рассматриваемой оптической схемы можно получить строгое аналитическое выражение для функции f. Оно имеет следующий вид

Почему и откуда можно получить это аналитическое строгое выражение?

Смотрите эквидистантную схему тут: Рыбий глаз (объектив) — Википедия (wikipedia.org)

Если для неё всё аккуратно расписать, то можно совершенно строго получить равенство (2), в котором вместо фокусного расстояния f' введена постоянная R0 для большего удобства реальной калибровки камеры на практике (съемка эталонного плоского изображения с известным расстоянием от него до точки схождения лучей объектива).

Можно представленный подход обобщить (этим мы тоже упражнялись, но в прод это не ушло, и в статье не отражено) на любую схему. Тогда равенство (2) будет иметь другой строгий вид (только нужно иметь ввиду, что эта строгость условная в том плане, что с помощью системы линз принципиально невозможно добиться дисторсии, тождественной одной из идеализированных схем). Далее на основе некой другой функциональной зависимости сходной с (2) можно построить соответствующую аппроксимирующую её функцию так, чтобы получать в итоге аналогичный конечный результат коррекции...

Спасибо за отличную и полезную статью!

Можете выложить исходный код вашего решения для быстрых тестов и сравнения с другими подходами?

Чем ваш подход лучше/хуже чем The Double Sphere Camera Model https://arxiv.org/pdf/1807.08957.pdf ?

Кодом, к сожалению, не могу поделиться: он под лицензией (принадлежит Заказчику проектной работы). Статья же содержит необходимое и достаточное количество формул, чтобы быстро воспроизвести результат. Пробегаете пиксели выходной матрицы изображения [xp(i), yp(j)], заполняя её соответствующими значениями яркости по исходным пикселям [xs(i'), ys(j')], положения которых определяете через формулы (3) - (8). Единственное, советую использовать, как минимум, билинейную аппроксимацию для вычисления яркости выходного пикселя по ближайшим 4 входным пикселям, поскольку узлы 2-х сеток совсем не совпадают. Более полную версию статьи см. здесь (там немного в иной форме некоторые выражения): https://arxiv.org/abs/2010.10295

Авторы указанной работы использовали аппроксимации иного уровня формализации. Лучше-хуже? Сложный вопрос. На него можно ответить только по результатам тестирования различных подходов по точности и производительности. Мы не ставили себе такой задачи.
А задача была такой: под конкретный объектив, используемый Заказчиком в практических целях, добиться практически идеальной быстрой компенсации дисторсии без потери поля зрения и разрешающей способности с увеличением размера выходного изображения не более, чем в 4 раза. И когда мы не нашли готового решения, удовлетворяющего критериям, пришлось "изобретать велосипед"... А исходный сыр-бор начался из необходимости не только детектировать лица людей с fisheye-камер, но и распознавать их даже когда они на периферии видеокадра...

У меня недавно возникло подозрение, что широкоугольные камеры телефонов имеют неравномерность от центра к углам. Что-то вроде того, что в центральная зона соответствует более длинофокусной оптике, чем тому, что на перефирийной зоне кадра.

Для этого и существуют полиномиальные корректировки этих расхождений, чтобы по итогу получить слегка поправленную модель дисторции:
https://april.eecs.umich.edu/wiki/Camera_suite#Recommended_camera_model

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации