Код нахождения наиболее дискриминативных компонент вектора признаков лица увы, но находится под лицензией Компании. Что же касается самого алгоритма, то он полноценно представлен в статье, чтобы с помощью описанной не очень-то сложной математики воплотить свою реализацию...
Кодом, к сожалению, не могу поделиться: он под лицензией (принадлежит Заказчику проектной работы). Статья же содержит необходимое и достаточное количество формул, чтобы быстро воспроизвести результат. Пробегаете пиксели выходной матрицы изображения [xp(i), yp(j)], заполняя её соответствующими значениями яркости по исходным пикселям [xs(i'), ys(j')], положения которых определяете через формулы (3) - (8). Единственное, советую использовать, как минимум, билинейную аппроксимацию для вычисления яркости выходного пикселя по ближайшим 4 входным пикселям, поскольку узлы 2-х сеток совсем не совпадают. Более полную версию статьи см. здесь (там немного в иной форме некоторые выражения): https://arxiv.org/abs/2010.10295
Авторы указанной работы использовали аппроксимации иного уровня формализации. Лучше-хуже? Сложный вопрос. На него можно ответить только по результатам тестирования различных подходов по точности и производительности. Мы не ставили себе такой задачи. А задача была такой: под конкретный объектив, используемый Заказчиком в практических целях, добиться практически идеальной быстрой компенсации дисторсии без потери поля зрения и разрешающей способности с увеличением размера выходного изображения не более, чем в 4 раза. И когда мы не нашли готового решения, удовлетворяющего критериям, пришлось "изобретать велосипед"... А исходный сыр-бор начался из необходимости не только детектировать лица людей с fisheye-камер, но и распознавать их даже когда они на периферии видеокадра...
Если для неё всё аккуратно расписать, то можно совершенно строго получить равенство (2), в котором вместо фокусного расстояния f' введена постоянная R0 для большего удобства реальной калибровки камеры на практике (съемка эталонного плоского изображения с известным расстоянием от него до точки схождения лучей объектива).
Можно представленный подход обобщить (этим мы тоже упражнялись, но в прод это не ушло, и в статье не отражено) на любую схему. Тогда равенство (2) будет иметь другой строгий вид (только нужно иметь ввиду, что эта строгость условная в том плане, что с помощью системы линз принципиально невозможно добиться дисторсии, тождественной одной из идеализированных схем). Далее на основе некой другой функциональной зависимости сходной с (2) можно построить соответствующую аппроксимирующую её функцию так, чтобы получать в итоге аналогичный конечный результат коррекции...
Советую, ради спорта, вживую реализовать любой из современных алгоритмов для объектива fisheye, охватывающего половину телесного угла (или более) с aspect ratio 1:1, и затем удержать 100% поля зрения при том же выходном размере изображения, что и входное, с уменьшением разрешающей способности по изображению не более, чем в 2 раза!
Получится, - пишите! Обязательно внесу изменения в статью!..
Математическая "кухня" - не в счет! В основе то лежит рассмотрение (описание) самой дисторсии через полином, пусть даже и весьма высокой степени...
При сохранении всего исправленного поля зрения "в лоб", у Вас будет либо почти бесконечно большая картинка по количеству пикселей, либо будет потеряна разрешающая способность по всей области чуть дальше внешней границы к центру, если удерживать их количество.
Теория - теорией (проекции и все такое...), а на практике не все так "гладко" и просто, как хотелось бы...
На сегодняшний день при исправлении дисторсии все существующие модели, во-первых, "не умеют" сохранять поле зрения с такой полнотой, и, во-вторых, имеют не единственный (R0), а множество настроечных (подгоночных) параметров модели...
У оптики свои достоинства! Но имеются и недостатки: либо у нас малый угол обзора и неискаженное изображение, либо искаженное изображение с большим углом обзора. И это противоречие для изображений и видео с камер "рыбий глаз" можно решить хоть как-то лишь с помощью цифровой обработки...
Код нахождения наиболее дискриминативных компонент вектора признаков лица увы, но находится под лицензией Компании. Что же касается самого алгоритма, то он полноценно представлен в статье, чтобы с помощью описанной не очень-то сложной математики воплотить свою реализацию...
Кодом, к сожалению, не могу поделиться: он под лицензией (принадлежит Заказчику проектной работы). Статья же содержит необходимое и достаточное количество формул, чтобы быстро воспроизвести результат. Пробегаете пиксели выходной матрицы изображения [xp(i), yp(j)], заполняя её соответствующими значениями яркости по исходным пикселям [xs(i'), ys(j')], положения которых определяете через формулы (3) - (8). Единственное, советую использовать, как минимум, билинейную аппроксимацию для вычисления яркости выходного пикселя по ближайшим 4 входным пикселям, поскольку узлы 2-х сеток совсем не совпадают. Более полную версию статьи см. здесь (там немного в иной форме некоторые выражения): https://arxiv.org/abs/2010.10295
Авторы указанной работы использовали аппроксимации иного уровня формализации. Лучше-хуже? Сложный вопрос. На него можно ответить только по результатам тестирования различных подходов по точности и производительности. Мы не ставили себе такой задачи.
А задача была такой: под конкретный объектив, используемый Заказчиком в практических целях, добиться практически идеальной быстрой компенсации дисторсии без потери поля зрения и разрешающей способности с увеличением размера выходного изображения не более, чем в 4 раза. И когда мы не нашли готового решения, удовлетворяющего критериям, пришлось "изобретать велосипед"... А исходный сыр-бор начался из необходимости не только детектировать лица людей с fisheye-камер, но и распознавать их даже когда они на периферии видеокадра...
Смотрите эквидистантную схему тут: Рыбий глаз (объектив) — Википедия (wikipedia.org)
Если для неё всё аккуратно расписать, то можно совершенно строго получить равенство (2), в котором вместо фокусного расстояния f' введена постоянная R0 для большего удобства реальной калибровки камеры на практике (съемка эталонного плоского изображения с известным расстоянием от него до точки схождения лучей объектива).
Можно представленный подход обобщить (этим мы тоже упражнялись, но в прод это не ушло, и в статье не отражено) на любую схему. Тогда равенство (2) будет иметь другой строгий вид (только нужно иметь ввиду, что эта строгость условная в том плане, что с помощью системы линз принципиально невозможно добиться дисторсии, тождественной одной из идеализированных схем). Далее на основе некой другой функциональной зависимости сходной с (2) можно построить соответствующую аппроксимирующую её функцию так, чтобы получать в итоге аналогичный конечный результат коррекции...
Советую, ради спорта, вживую реализовать любой из современных алгоритмов для объектива fisheye, охватывающего половину телесного угла (или более) с aspect ratio 1:1, и затем удержать 100% поля зрения при том же выходном размере изображения, что и входное, с уменьшением разрешающей способности по изображению не более, чем в 2 раза!
Получится, - пишите! Обязательно внесу изменения в статью!..
Математическая "кухня" - не в счет! В основе то лежит рассмотрение (описание) самой дисторсии через полином, пусть даже и весьма высокой степени...
При сохранении всего исправленного поля зрения "в лоб", у Вас будет либо почти бесконечно большая картинка по количеству пикселей, либо будет потеряна разрешающая способность по всей области чуть дальше внешней границы к центру, если удерживать их количество.
Теория - теорией (проекции и все такое...), а на практике не все так "гладко" и просто, как хотелось бы...
В оригинальной статье есть ссылки и на более современные подходы...
В настоящее время, даже нейросети умудряются обучать для решения проблемы.
Что касаемо "https://docs.opencv.org/4.5.2/db/d58/group__calib3d__fisheye.html", так здесь в основе всё та же геометрия и, соответственно, всё те же Brown и Conrady.
На сегодняшний день при исправлении дисторсии все существующие модели, во-первых, "не умеют" сохранять поле зрения с такой полнотой, и, во-вторых, имеют не единственный (R0), а множество настроечных (подгоночных) параметров модели...
У оптики свои достоинства!
Но имеются и недостатки: либо у нас малый угол обзора и неискаженное изображение, либо искаженное изображение с большим углом обзора. И это противоречие для изображений и видео с камер "рыбий глаз" можно решить хоть как-то лишь с помощью цифровой обработки...
С формулами теперь - порядок (удалось таки удачно преобразовать Latex скрипты в растр)!