Из фото в 3D, ч.2: калибровка камеры

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

В первой части статьи мы немного поупражнялись на яблоках, чтобы понять, как 3D-объекты проецируются на 2D-плоскость фотографии. Заодно мы описали математическую модель камеры и ее параметры.

Знаешь параметры — живешь в Сочи можешь восстановить 3D-сцену или ее характеристики: высоту здания, расстояние до пешехода, загруженность самосвала. Словом, сплошная польза для целого ряда отраслей. 

А вот как именно определить эти заветные параметры, так и осталось за кадром. К тому же мы рассматривали простейшую модель pinhole, но в реальной жизни все сложнее. У большинства камер есть линзы, которые искажают изображения (вспомните эффект fisheye). Все эти «рыбьи глаза»‎ и другие отклонения нужно как-то корректировать.

О том, как восстанавливать параметры камеры (калибровать ее) и нивелировать искажения (дисторсию), читайте в этой публикации.

Также из нее вы узнаете:

  • как выглядит математическая модель калибровки и дисторсии;

  • как собрать датасет для калибровки;

  • какие есть методы калибровки;

  • детали одного из этих методов.

Одна из главных задач машинного зрения — определить ориентацию и положение камеры в пространстве на основе полученного изображения. Результаты ее решения позволяют создать виртуальную сцену с плоским маркером-объектом и точно определить позицию самой камеры. Более того, такой подход помогает устранять искажения на всех ее изображениях. Это особенно актуально в контексте задач виртуальной и дополненной реальности: точно наложить двумерное изображение на плоскость стены или разместить трехмерную модель на поверхности стола.

Рисунок 1. Фото до (слева) и после (справа) калибровки камеры (источник)
Рисунок 1. Фото до (слева) и после (справа) калибровки камеры (источник)

На рисунке выше показана фотография, снятая камерой с объективом fish-eye («рыбий глаз»). Он имеет очень широкий угол обзора, что приводит к деформациям изображения. Все выглядит округлым и выпуклым, а перспектива плывет. Слева мы видим фото с такими искажениями, а справа запечатлено то же самое, только уже после процесса калибровки камеры. Калибровка позволяет уменьшить или устранить деформацию и, как следствие, вернуть объекту естественный вид. Как бы это ни походило на рекламу крема от морщин, именно так оно и работает.

Маркеры и датасет

Для калибровки камеры нужно собрать датасет из изображений, созданных по определенным параметрам — только тогда алгоритм даст хороший результат. Поэтому давайте познакомимся с требованиями к датасету. А чтобы лучше их понять, сперва поговорим о маркерах, которые используются в процессе калибровки камеры для определения ее параметров и возможных искажений при формировании картинки.

Маркеры

Все маркеры и их паттерны (множество повторяющихся в определенном порядке маркеров) имеют четкую геометрическую структуру и регулярность. Поэтому они удобны для анализа и коррекции деформаций. Благодаря маркерам мы знаем известные точки в мировых координатах, например, в миллиметрах, и точки в пикселях.

Рассмотреть все существующие маркеры в одной статье не получится, иначе одно перечисление потянет на талмуд. Остановимся на самых основных.

Шахматная доска (chessboard) и ChArUco-маркеры

В случае с шахматной доской необходимо, чтобы вся она попадала в кадр при сборе датасета. Если хотя бы малая ее часть выпадет, алгоритм потеряет один или несколько углов. И тогда шах и мат: не удастся точно соотнести между собой 3D и 2D-точки. 

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

Важно, что для исключения инвариантности к вращению число строк должно быть четным, а число столбцов — нечетным (или наоборот). Иначе может возникнуть неоднозначность вращения.

Рисунок 2. Маркер шахматная доска 
Рисунок 2. Маркер шахматная доска 

Что касается ChArUco, то это смесь шахматной доски и ArUco-маркера, который полностью состоит из ArUco-меток.

ArUco-метками называются уникальные коды, которые обеспечивают устойчивость к ориентации. Также они устойчивы к таким искажениям, как небольшие изменения углов или формы. При использовании ChArUco для отслеживания объектов ArUco-маркеры дают точки, по которым можно достоверно определить положение и ориентацию объектов. А еще благодаря этому паттерну не возникнет проблем при неполном попадании объектов в кадр.

Рисунок 3. Маркер ChArUco
Рисунок 3. Маркер ChArUco

Асимметричный и симметричный паттерны из кружков

Кружки на изображении могут быть обнаружены как blob’ы с помощью OpenCV. При этом есть условия для удаления неправильных кандидатов. Политический PR и предвыборные гонки здесь ни при чем: имеются в виду условия на площадь, окружность и другие.

Асимметричные сетки более предпочтительны для оптимизации геометрии и калибровки стереоизображений. Кружки же, как и эллипсы, подвержены искажениям перспективы и дисторсии. Для точной калибровки необходимо учесть форму эллипсов и центр проекции кругов. Точность в определении кружков в теории выше в сравнении с другими маркерами, так как они могут детектироваться с субпиксельной точностью. Но на практике особой разницы между ними и остальными маркерами мной замечено не было.

Рисунки 4 и 5: асимметричный и симметричный паттерны
Рисунки 4 и 5: асимметричный и симметричный паттерны

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

Можно сгенерировать и скачать нужный вам паттерн или сгенерировать свой паттерн при помощи OpenCV. А еще здесь можно почитать про особенности маркеров.

Датасет

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

Сперва приготовьте маркер для калибровки. Распечатайте его и аккуратно прикрепите на гладкую поверхность, например, на доску или стену. Никаких искажений на нем быть не должно.

Рисунок 6. Процесс сбора датасета. Доска, сделанная мной во время работы в стартапе PTF Lab в 2019 году. И счастливый и довольный CEO стартапа :)
Рисунок 6. Процесс сбора датасета. Доска, сделанная мной во время работы в стартапе PTF Lab в 2019 году. И счастливый и довольный CEO стартапа :)

Затем расположите подготовленную поверхность с маркером в выбранном помещении. Проведите съемку маркера с разных ракурсов и ориентаций. Необходимо представить в вашем датасете разнообразные ракурсы. Тогда камера сможет увидеть маркер под разными углами. Расположите маркер как по центру изображения, так и по его краям. Для каждого положения сделайте несколько снимков, меняя угол обзора и расстояние между камерой и маркером.

Особое внимание следует уделить варьированию расстояний между камерой и маркером, а также размеру маркера на изображении. Это имеет большое значение для учета искажений, которые могут возникнуть при разных условиях

Истинные точки координат маркера (X, Y, 0) мы получаем благодаря знанию о паттерне. Третья координата, отвечающая за глубину, для удобства равна нулю. Ведь нам все равно, где определять мировую систему координат, поэтому точки паттерна можно указать как угодно. Обычно длину ячейки паттерна определяют как единицу следующим образом: (0, 0, 0), (0, 1, 0), (…) (9, 6, 0).

Качество фото и собранного материала очень сильно влияет на уровень калибровки

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

Сильно влияет на ошибку и количество сделаных изображений. Нужно получить как можно больше картинок для того, чтобы параметры камеры были подобраны лучше.

Но вернемся к нашей последовательности шагов. Далеераспечатайте шаблонна толстой бумаге, которая не будет сильно и легко деформироваться. Можно склеивать несколько распечатанных маркеров, чтобы получить большее количество точек и лучшее качество. Только учтите, чтобы все части маркеров должны быть ортогональны друг другу.

Рисунок 7. Процесс сбора датасета с кружками. Доска, сделанная мной во время работы в стартапе PTF Lab. И уже не такой счастливый CEO стартапа : ) Ошибкой было сделать доску такой маленькой
Рисунок 7. Процесс сбора датасета с кружками. Доска, сделанная мной во время работы в стартапе PTF Lab. И уже не такой счастливый CEO стартапа : ) Ошибкой было сделать доску такой маленькой

Результат может испортить автофокус камеры, поэтому его надо отключить. Фокусировка физически перемещает одну или несколько частей стекла внутри вашего объектива, слегка изменяя поле зрения, искажение объектива и оптический центр (principle point).

На моей практике лучшие результаты показывал шахматный маркер. На нем удавалось достичь наименьшей ошибки при фиксированном количестве детектируемых изображений. Наилучший эффект достигался, когда использовалась шахматная доска размером от 10x10 и более — это увеличивает количество точек, которые удается детектировать.

Кому интересно, можно посмотреть пример использования «‎шахматной доски»‎ из доклада Расима Ахунзянова «Калибровка камеры к лидару»:

Рисунки 8 и 9: маркеры — шахматная доска
Рисунки 8 и 9: маркеры — шахматная доска

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

Вдобавок желательно по возможности избегать «сложных» линз. Для зум- или супер широкоугольных объективов требуются гораздо более сложные линзы, чем доступные для использования OpenCV-модели. Поэтому мы рассматриваем модель камеры с точечной диафрагмой (pinhole модель).

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

Кратко подытожим, что важно при сборе датасета:

  • гладкая поверхность для прикрепления маркера;

  • различные ракурсы;

  • варьирование расстояний между камерой и маркером + размер маркера;

  • не слишком острый угол для изображений;

  • матовая поверхность маркеров для избегания световых бликов;

  • количество изображений (делаем побольше);

  • отключенный автофокус камеры;

  • типографический принтер;

  • несложные линзы (по возможности);

  • не чрезмерное и не слабое освещение.

Следуя этой инструкции, вы сможете эффективно собрать датасет для калибровки камеры и получить точные результаты.

Калибровка одной камеры, или pinhole-модель

И вот после изучения маркеров и сборки датасета мы можем, наконец, переходить к третьей части Марлезонского балета самой калибровке камеры.

Калибровка — это настройка внутренних параметров матрицы камеры K, параметров дисторсии, а также внешних параметров матрицы R и вектора t с использованием набора известных пар точек (Xw, Yw, Zw)T и соответствующих им координат изображения (u, v)T. Она дает “билеты в два конца”: позволяет корректно преобразовывать трехмерные мировые координаты в двумерные на изображении и обратно. Это может быть полезно, например, для разработки и создания систем виртуальной (VR) или аугментированной (AR) реальности.

Существует много способов калибровки камеры. В этой статье мы познакомимся с методом Zhang, названным по имени одного научного сотрудника Microsoft. Такой метод реализован в Matlab и OpenCV. Сейчас мы разберем это аналитическое решение с помощью подхода DLT для одного обзора (single view) и для множественных обзоров (multiple views) камеры. Затем уточним полученные значения и минимизируем функцию потерь. 

На всякий случай поясним, что DLT (Direct Linear Transform) — это математический подход на основе линейных алгебраических операций для оценки параметров камеры и преобразования координат. В свою очередь, метод Zhang является модификацией DLT, которая учитывает дисторсию (искажение) объектива и предлагает дополнительные шаги к повышению точности калибрации. 

Нотации

Прочитать нотации все же придется, так как без них калибровка не получится. Итак, поехали.

  • P_w=(X_w, Y_w, Z_w)^T— 2D точка на плоскости;

  • P_с = (X_с, Y_с, Z_с)^T— 3D точка в мировом пространстве;

  • P_с = (X_с, Y_с, Z_с)^T— 3D точка в пространстве камеры.

Эти точки будут переводиться в однородные координаты и обозначаться как:

  • \tilde{p} = (u, v, 1)^T

  • \tilde P_w = (X_w, Y_w, Z_w, 1)^T

Отношение между 3D-точкой и точкой на 2D плоскости выглядит так:

\lambda \tilde p = K[R|t] \tilde P_w

где:

  • \lambda — коэффициент масштаба;

  • R и t — внешние параметры камеры для перехода из P_wвP_c;

  • \tilde{p}2D точка в однородных координатах;

  • \tilde{P_w}3D точка в однородных координатах;

  • K — внутренние параметры камеры.

Камера представляется таким образом:

K = \begin{bmatrix}     f_u & \gamma & c_u \\     0 & f_v & c_v \\     0 & 0 & 1 \\ \end{bmatrix}

где:

  • (c_u, c_v) — координата главной точки (principal point);

  • f_u и f_v — фокусное расстояние и коэффициенты масштаба в осях изображения u и v, которые позволяют учесть масштабные искажения из-за особенностей оптической системы камеры;

  • \gamma — скос, или параметр, описывающий асимметрию двух осей изображения.

Калибровка камеры аналитическим методом

И снова возвращаемся к нашему подходу DLT для калибровки камеры с одной точки обзора (single view). Идея здесь следующая: приводим уравнение перспективной проекции в однородный и линейный вид и решаем его стандартными методами.

Для каждого изображения существует 3D-2D-отношение пар точек, а также составляется система уравнений следующего вида.

\lambda\begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = K \begin{bmatrix}   r_{11} & r_{12} & r_{13} & t_1 \\   r_{21} & r_{22} & r_{23} & t_2 \\   r_{31} & r_{32} & r_{33} & t_3 \\ \end{bmatrix}  \begin{bmatrix} X_w \\ Y_w \\ 0 \\ 1 \end{bmatrix} \Rightarrow \lambda\begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = K \begin{bmatrix}   r_{11} & r_{12} & t_1 \\   r_{21} & r_{22} & t_2 \\   r_{31} & r_{32} & t_3 \\ \end{bmatrix}  \begin{bmatrix} X_w \\ Y_w \\ 1 \end{bmatrix}

Такой метод предполагает присутствие всех точек на одной плоскости (шахматная доска), поэтому в формуле выше Z = 0, а матрица [R|t] меняет размерность с 3x4 на 3х3.

Теперь вводим понятие гомографии. С ним уравнение принимает следующий вид:

\lambda\begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = K \begin{bmatrix}   r_{11} & r_{12} & t_1 \\   r_{21} & r_{22} & t_2 \\   r_{31} & r_{32} & t_3 \\ \end{bmatrix}  \begin{bmatrix} X_w \\ Y_w \\ 1 \end{bmatrix} \Rightarrow \lambda\begin{bmatrix} u \\ v \\ 1 \end{bmatrix} =  \begin{bmatrix}   h_{11} & h_{12} & h_{13} \\   h_{21} & h_{22} & h_{23} \\   h_{31} & h_{32} & h_{33} \\ \end{bmatrix}  \begin{bmatrix} X_w \\ Y_w \\ 1 \end{bmatrix} \Rightarrow \lambda\begin{bmatrix} u \\ v \\ 1 \end{bmatrix} =  H  \begin{bmatrix} X_w \\ Y_w \\ 1 \end{bmatrix}

где H— гомография, которая описывает отношение между двумя проективными преобразованиями.

Рисунок 10. Типы 2D-трансформаций
Рисунок 10. Типы 2D-трансформаций

Затем мы представляем матрицу Hкак 3 вектора h_i^Tгде h^T_ii-ая строка (всего 3 строки и 1 столбец), а [X_w, Y_w, 1]^T как \tilde{P_w}:

\lambda\begin{bmatrix} u \\ v \\ 1 \end{bmatrix} =  \begin{bmatrix}   h_{1}^T  \\   h_{2}^T  \\   h_{3}^T  \\ \end{bmatrix}  \begin{bmatrix} X_w \\ Y_w \\ 1 \end{bmatrix}\Rightarrow \lambda\begin{bmatrix} u \\ v \\ 1 \end{bmatrix} =  \begin{bmatrix}   h_{1}^T  \\   h_{2}^T  \\   h_{3}^T  \\ \end{bmatrix} \tilde P_w

А вот обратное преобразование однородных координат в пиксельные координаты:

\begin{aligned}& u=\frac{\lambda u}{\lambda}=\frac{h_1^{\mathrm{T}} \cdot \tilde P_w}{h_3^{\mathrm{T}} \cdot \tilde P_w} \\& v=\frac{\lambda v}{\lambda}=\frac{h_2^{\mathrm{T}} \cdot \tilde P_w}{h_3^{\mathrm{T}} \cdot \tilde P_w}\end{aligned} \Rightarrow \quad \begin{aligned}& \left(h_1^{\mathrm{T}}-u_i h_3^{\mathrm{T}}\right) \cdot \tilde P_{wi}=0 \\& \left(h_2^{\mathrm{T}}-v_i h_3^{\mathrm{T}}\right) \cdot \tilde P_{wi}=0\end{aligned}

Переставив слагаемые, мы получим уравнение для одной точки:

\begin{aligned}& \left(h_1^{\mathrm{T}}-u_i h_3^{\mathrm{T}}\right) \cdot P_i=0 \\& \left(h_2^{\mathrm{T}}-v_i h_3^{\mathrm{T}}\right) \cdot P_i=0\end{aligned} \quad \Rightarrow \begin{aligned}& P_i^{\mathrm{T}} \cdot h_1+0 \cdot h_2^{\mathrm{T}}-u_i P_i^{\mathrm{T}} \cdot h_3^{\mathrm{T}}=0 \\& 0 \cdot h_1^{\mathrm{T}}+P_i^{\mathrm{T}} \cdot h_2^{\mathrm{T}}-v_i P_i^{\mathrm{T}} \cdot h_3^{\mathrm{T}}=0\end{aligned} \quad \Rightarrow \left[\begin{array}{ccc}P_i^{\mathrm{T}} & 0^{\mathrm{T}} & -u_1 P_i^{\mathrm{T}} \\0^{\mathrm{T}} & P_i^{\mathrm{T}} & -v_1 P_i^{\mathrm{T}}\end{array}\right]\left[\begin{array}{l}h_1 \\h_2 \\h_3\end{array}\right]=\left[\begin{array}{l}0 \\0\end{array}\right]

Для


Интересные статьи

Интересные статьи

Всем привет. На волне отключений shutterstok и всеобщего импортозамещения, решила поделиться своей дипломной работой и расписать принципы, которым можно следовать при создании своих стоков с фотографи...
Лето 2022. Вспышка, идея, Open Air! Пора бы кости размять, решили мы, и вылезли из-за мониторов. Как-никак последний раз под открытым небом мы собирались 9 лет назад, а по меркам геймдева это вечность...
Продолжаю публиковать обзоры винтажных гаджетов, которые попали ко мне разными путями — от подарков до покупок на барахолке. Винтажная камера, которая сегодня на обзоре, очень необычная — она предна...
В предыдущих двух частях мы научились анализировать нашу камеру и подбирать оптимальную экспозицию исходя из математических принципов.Теперь мы бы хотели эти два умения объединить и получить некую дор...
Привет, Хабр! На днях возникла типовая задача — помочь знакомой превратить гору фотографий в упорядоченную иерархию. Всё бы ничего, но гор фотографий не одна, а две — на Mac и на ноуте под Win...