Назад
499

Калибровка камеры

499

Введение

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

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

На рисунке выше показана фотография, снятая камерой с объективом fish-eye (”рыбий глаз”). Этот тип объектива имеет очень широкий угол обзора, что приводит к деформациям изображения — оно выглядит округлым и выпуклым и сильно искажает перспективу. Слева мы видим фото с такими искажениями, а справа — то же самое фото, но уже после процесса калибровки камеры. Калибровка позволяет уменьшить или устранить искажения, следовательно, вернуть объекту естественный вид.

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

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

Маркеры

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

Вообще, есть очень много маркеров. Мы рассмотрим основные из них:

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

В случае с шахматной доской нам важно попадание всей доски в кадр при сборе датасета. Если часть доски не попадет в кадр, алгоритм потеряет один или несколько углов. Тогда мы не сможем точно соотнести \( 3D \)-точки с \( 2D \)-точками. С другой стороны, плюс этого маркера в том, что углы шахматной доски (седловые точки) определяются с высокой точностью. Они не подвержены искажениям при перспективных преобразованиях или дисторсии объектива.

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

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

ChArUco — смесь двух маркеров, а именно шахматной доски и ArUco маркера, который полностью состоит из ArUco меток.

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

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

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

Кружки на изображении могут быть обнаружены как blob’ы с помощью OpenCV. Есть условия для удаления неправильных кандидатов (например, условия на площадь, окружность и другие).

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

Рисунок 4. Асимметричный паттерн

Рисунок 5. Симметричный паттерн

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

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

Датасет

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример использования шахматной доски из доклада Расима Ахунзянова “Калибровка камеры к лидару”:

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

Есть смысл использовать шахматную доску больше, чем 10×10. Это увеличит количество точек, которые мы сможем детектировать.

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

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

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

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

  • гладкая поверхность для прикрепления маркера
  • различные ракурсы
  • варьирование расстояний между камерой и маркером + размер маркера
  • не очень острый угол для изображений
  • матовая поверхность маркеров для избегания световых бликов
  • количество изображений (делаем побольше)
  • отключенный автофокус камеры
  • типографический принтер
  • несложные линзы (по возможности)
  • не чрезмерное и не очень слабое освещение

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

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

Теперь после сбора датасета мы можем переходить к калибровке камеры.

Калибровка — настройка внутренних параметров матрицы камеры \( K \), параметров дисторсии, а также внешних параметров матрицы \( R \) и вектора \( t \) с использованием набора известных пар точек \( ( X_w, Y_w, Z_w)^T \) и соответствующих им координат изображения (\( u, v)^T \). Калибровка позволяет корректно преобразовывать трехмерные мировые координаты в двумерные на изображении и обратно. Это может быть полезно, например, для разработки и создания систем виртуальной реальности (VR) или аугментированной реальности (AR).

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

DLT (Direct Linear Transform) — математический подход, который использует линейные алгебраические операции для оценки параметров камеры и преобразования координат.

Нотации

Для начала вспомним и обозначим некоторые нужные нам нотации:

  • \( p = (u, v)^T \) — 2D точка на плоскости;
  • \( P_w=(X_w, Y_w, Z_w)^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 \) — скос, или параметр, описывающий асимметрию двух осей изображения.

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

Итак, возвращаемся к нашему методу Zhang для калибровки камеры с одной точки обзора (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] \) меняет размерность с 3×4 на 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 трансформаций

Затем мы представляем матрицу \( H \) как 3 вектора \( h_i^T \), где \( h^T_i \) — \( i \)-ая строка (всего 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] \)

Для \( 𝑛 \) точек (одно фото или одна точка обзора) мы можем объединить все эти уравнения в большую матрицу:

\( \left[\begin{array}{ccc} P_1^{\mathrm{T}} & 0^{\mathrm{T}} & -u_1 P_1^{\mathrm{T}} \\ 0^{\mathrm{T}} & P_1^{\mathrm{T}} & -v_1 P_1^{\mathrm{T}} \\ \cdots & \cdots & \cdots \\ P_n^T & 0^{\mathrm{T}} & -u_n P_n^{\mathrm{T}} \\0^{\mathrm{T}} & P_n^{\mathrm{T}} & -v_n P_n^T \\ \end{array}\right ]\left[\begin{array}{l} h_1 \\h_2 \\h_3 \end{array}\right] = \left[\begin{array}{l} 0 \\ 0 \\ \vdots \\ 0 \\ 0 \end{array}\right] \Rightarrow Q \cdot H = 0 \)

где \( Q \) — известная матрица, а \( H \) — неизвестная матрица.

Однозначное решение (Minimal solution):

  • \( Q \)\( (2𝑛×9) \) должен иметь ранг 8 для одного (в пределах масштаба) нетривиального решения;
  • каждое соответствие точек \( 3D-2D \) дает 2 независимых уравнения;
  • требуется минимум 4 неколлинеарных точки.

Однозначное решение – система, где число уравнений равно числу неизвестных.

Переопределенное решение (Over-determined):

  • \( n \) ≥ 4 точек;
  • можно решить с помощью сингулярного разложения \( SVD \).

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

Матрица \( H \) может быть декомпозирована для получения \( K, R, t \) следующим образом:

\( \begin{bmatrix} h_{11} & h_{12} & h_{13} \\ h_{21} & h_{22} & h_{23} \\ h_{31} & h_{32} & h_{33} \\ \end{bmatrix} = \begin{bmatrix} f_u & \gamma & c_u \\ 0 & f_v & c_v \\ 0 & 0 & 1 \\ \end{bmatrix}\begin{bmatrix} r_{11} & r_{12} & t_1 \\ r_{21} & r_{22} & t_2 \\ r_{31} & r_{32} & t_3 \\ \end{bmatrix} \)

Отметим, что для декомпозиции нужны минимум 2 точки обзора. На практике оказывается, чем больше точек, тем лучше. Берем 20–50 изображений, охватывающих все поле зрения камеры, для достижения наилучших результатов калибровки.

Для каждого обзора \( j \) будет своя гомография \( H^j \) , матрица поворота и смещения \( R^j \), \( t^j \). При этом, \( K \) останется таким же.

\( \begin{bmatrix} h_{11}^j & h_{12}^j & h_{13}^j \\ h_{21}^j & h_{22}^j & h_{23}^j \\ h_{31}^j & h_{32}^j & h_{33}^j \\ \end{bmatrix} = \begin{bmatrix} f_u & \gamma & c_u \\ 0 & f_v & c_v \\ 0 & 0 & 1 \\ \end{bmatrix}\begin{bmatrix} r_{11}^j & r_{12}^j & t_1^j \\ r_{21}^j & r_{22}^j & t_2^j \\ r_{31}^j & r_{32}^j & t_3^j \\ \end{bmatrix} \)

Нам осталось рассмотреть алгоритм получения параметров камеры из матрицы H для множественных точек обзора:

  1. Оцениваем гомографию \( 𝐻_𝑖 \) для каждого \( 𝑖 \)-го представления с помощью алгоритма DLT
  2. Определяем внутренние параметры \( 𝐾 \) по набору гомографий:
  • каждая гомография \( 𝐻_𝑖 ∼ 𝐾𝒓1, 𝒓2, 𝒕 \) дает два линейных уравнения в 6 элементах матрицы \( B ≔ 𝐾 −⊤𝐾 −1 \)
  • если \( h_1 = Kr_1, h_2 = Kr_2 \) и ограничения вращения \( r_1^Tr_1 = r_2^Tr_2 = 1 \) и \( r_1^Tr_2 = 0 \), то \( h_1^TBh_1 − h_2^TBh_2 = 0 \) и \( h_1^TBh_2 = 0 \)
  1. Объединяем \( 2N \) уравнения из \( N \) обзоров для получения линейной системы \( Vb=0 \), где \( V \) — матрица известных нам координат на изображении и мировых координат на шахматной доске.
  2. Решаем уравнение и находим \( b \) (то есть \( B \))
  3. Декомпозируем матрицу \( B \) и получаем \( K \):

\( \begin{aligned}c_v & =\left(B_{12} B_{13}-B_{11} B_{23}\right) /\left(B_{11} B_{22}-B_{12}^2\right) \\\lambda & =B_{33}-\left[B_{13}^2+c_v\left(B_{12} B_{13}-B_{11} B_{23}\right)\right] / B_{11} \\ f_u & =\sqrt{\lambda / B_{11}} \\ f_v & =\sqrt{\lambda B_{11} /\left(B_{11} B_{22}-B_{12}^2\right)} \\\gamma & =-B_{12} f_u^2 f_v / \lambda \\c_u & =\gamma c_v / f_v-B_{13} f_u^2 / \lambda\end{aligned} \)

  1. Зная внутренние параметры камеры, мы получаем ее внешние параметры:

\( \begin{aligned} r_1 & = \lambda K^{-1} h_1 \\ r_2 & = \lambda A^1 h_2 \\ r_3 & = r_1 \times r_2 \\ & t = \lambda K^{-1} h_3\end{aligned} \)

где \( \lambda \) — коэффициент масштаба.

\( \lambda = 1/ ||K^{-1}h_1||= 1/ ||K^{-1}h_2|| \)

  1. И теперь получаем матрицу вращения \( R_i = [r_1, r_2, r_3] \).

Для однозначного решения (Minimal solution):

  • \( V \) матрица \( (2𝑛×6) \);
  • каждое соответствие точек \( 3D-2D \) дает 2 независимых уравнения;
  • при \( n ≥ 3 \) будет единственное решение \( b \), определенное с точностью до масштабного коэффициента;
  • при \( n = 1 \) мы сможем вычислить только фокусное расстояние.

Ошибка перепроецирования

Для оценки нашего алгоритма нужно вычислить ошибку перепроецирования (reprojection error).

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

Параметры калибровки \( K, R, t \) , определенные с помощью DLT, можно уточнить путем минимизации функции потерь:

\( \text{reprojection error} = \sum_{i=1}^n\sum_{j=1}^m \|p_{ij} — p_{\text{proj}}(K, R_i, t_i, P_{w}^j)\|^2 \)

где даны \( n \) изображений плоскости модели,

на плоскости модели имеется \( m \) точек,

а \( p_{\text{proj}}(K, R_i, t_i, P_{w}^j) \) — проекция точки \( P_{w}^j \) на изображении \( i \) согласно уравнению:

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

Рисунок 11. Уточнение внутренних и внешних параметров камеры

Мы подошли к еще одному внутреннему параметру камеры – дисторсии.

Дисторсия

Дисторсия (distortion) — это искажение изображения, вызванное несоответствием между фактической геометрией объектов в сцене и их представлением на фотографии. Она проявляется из-за физических характеристик камеры и объектива, которые могут привести к искажениям в углах, длинах и формах объектов на изображении.

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

Есть несколько видов дисторсии, каждый из которых имеет отличительные характеристики и влияет на изображение в разной степени. Давайте рассмотрим некоторые из них:

  1. Радиальная дисторсия, или искривление объектива (Radial distortion): объекты на краях кадра могут быть изогнуты или растянуты. Она может быть бочкообразной (объекты сжимаются к центру кадра) или подушкообразной (объекты вытягиваются от центра кадра).
Рисунок 12. Бочкообразная (Barrel) дисторсия
Рисунок 13. Подушкообразная (Pincushion) дисторсия

\( \begin{align*}x_{\text{distorted}} &= x \left(1 + k_1 \cdot r^2 + k_2 \cdot r^4\right) \\y_{\text{distorted}} &= y \left(1 + k_1 \cdot r^2 + k_2 \cdot r^4\right)\end{align*} \)

где \( r \) — расстояние от пикселя изображения до главной точки (principal point),

\( k_1, k_2 \) — дополнительные нелинейные параметры радиальной дисторсии .

  1. Тангенциальная, или перспективная дисторсия (Tangential distortion): неправильное положение объектива относительно плоскости изображения. Она может привести к наклону вертикальных или горизонтальных линий, которые начинают казаться искривленными.
Рисунок 14. Тангенциальная дисторсия
Рисунок 15. Тангенциальная дисторсия

\( \begin{align*}x_{\text{distorted}} &= x + [2 \cdot p_1 \cdot x \cdot y + p_2 \cdot (r^2 + 2 \cdot x^2)] \\y_{\text{distorted}} &= y + [p_1 \cdot (r^2 + 2 \cdot y^2) + 2 \cdot p_2 \cdot x \cdot y]\end{align*} \)

где \( r \) — расстояние от пикселя изображения до главной точки (principal point),

\( p_1, p_2 \) — дополнительные нелинейные параметры тангенциальной дисторсии.

Возвращаемся к pinhole

Модель линейной камеры (pinhole) — идеальная модель проекции, которая не учитывает искажения объектива при проецировании 3D точки \( ( X, Y, Z)^T \) на плоскость изображения. Для моделирования искажения проецируемой точки 2D пикселя \( (u, v)^T \) с помощью pinhole нам нужно сначала оценить нормализованные координаты 2D точек \( (\bar{u}, \bar{v})^T \). Для этого мы можем использовать калибровочную матрицу \( K \) со следующим выражением:

\( \begin{bmatrix} \bar{u} \\ \bar{v} \\ 1 \end{bmatrix}= K^{-1} \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} \)

Нормализованная искаженная точка \( (\bar{u}_{distorted}, \bar{v}_{distorted}) \) определяется как:

\( \begin{align*} \begin{bmatrix} \bar{u}_d \\ \bar{v}_d \end{bmatrix} &= \frac{ 1 + k_1 \cdot r^2 + k_2 \cdot r^4 + k_3 \cdot r^6 }{ 1 + k_4 \cdot r^2 + k_5 \cdot r^4 + k_6 \cdot r^6 } \begin{bmatrix} \bar{u} \\ \bar{v} \end{bmatrix} \\ &\quad+ \left[ \frac{2 \cdot p_1 \cdot \bar{u} \cdot \bar{v} + p_2 \cdot (r^2 + 2 \cdot \bar{u}^2)}{2 \cdot p_2 \cdot \bar{u} \cdot \bar{v} + p_1 \cdot (r^2 + 2 \cdot \bar{v}^2)} \right] \end{align*} \)

где \( (u, v)^T \) — \( 2D \) точка пикселя,

\( (\bar{u}, \bar{v})^T \) — нормализованные координаты \( 2D \) точки камеры,

\( k_1, k_2, k_3, k_4, k_5, k_6 \) — коэффициенты радиальной дисторсии (параметров больше для учета более сильной дисторсии),

\( p_1, p_2 \) — коэффициенты тангенциальной дисторсии,

\( r = \bar{u}^2 + \bar{v}^2 \) — расстояние от пикселя изображения до главной точки (principal point).

Далее нам просто нужно вернуться к исходному (ненормализованному) пиксельному пространству. Для этого мы можем использовать внутреннюю матрицу \( K \):

\( \begin{bmatrix} u_d \\ v_d \\ 1 \end{bmatrix}= K\begin{bmatrix}\bar{u}_d \\ \bar{v}_d \\ 1 \end{bmatrix} \)

Таким способом мы смоделировали радиальное и тангенциальное искажения для линейной модели камеры (pinhole).

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

Как учитывать радиальную дисторсию?

Нам нужно учитывать \( m \) точек на n изображениях и складывать все уравнения, чтобы получить \( 2mn \) уравнений, или \( Dk = d \), где \( k = [k1, k2]^T \) в матричной форме.

Линейное решение методом наименьших квадратов выглядит так:

\( k = (D^TD)^{-1}D^Td \)

Теперь у нас функция потерь представляется следующим образом:

\( \text{reprojection error} = \sum_{i=1}^n\sum_{j=1}^m \|p_{ij} — p_{\text{proj}}(K,k_1,k_2,R_i, t_i, P_{w}^j)\|^2 \)

Заключение

Итак, мы с вами познакомились с дисторсией, калибровкой камеры, практическими советами по сбору датасета и калибровке, DLT-методом калибровки и ошибкой перепроецирования.

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

  1. Распечатать калибровочный паттерн и наклеить его на твердую плоскость;
  2. Сделать много разных фото (20-50 изображений), двигая камеру или паттерн в пространстве, математически здесь никакой разницы нет;
  3. Получить координаты точек на паттерне;
  4. Получить внутренние и внешние параметры камеры с помощью DLT-метода;
  5. Получить коэффициенты радиального и других искажений путем решения линейного МНК;
  6. Уточнить все параметры, минимизировав функцию потерь.

Теперь вы можете пользоваться этим алгоритмом для успешной калибровки камеры 🙂

Полезные ссылки

  • Если вы хотите попробовать откалибровать камеру, то в качестве основного инструмента можно использовать OpenCV, в котором есть все необходимые опции. Он предоставляет объекты для каждого из маркеров, и в каждом объекте есть своя функция калибровки.
  • Кроме этой библиотеки можно использовать библиотеку Kornia. Там тоже реализованы методы калибровки для разных видов камеры, а еще метод DLT.
  • Создать дисторсии на примере тех, что представлены выше, можно при помощи этой библиотеки.
  • Cсылка на раздел калибровки с библиотекой Kornia.
  • Доклад Расима Ахунзянова “Калибровка камеры к лидару”.
  • Список статей и реализаций под разные фреймворки.
  • Генерация своего паттерна с OpenCV и генерация паттерна через UI.
  • И еще можно больше почитать про DLT за 5 минут и про особенности маркеров.

Что изучить дальше

  1. Исследование 2000 года про метод Zhang.
  2. 12 бесплатных лекций по фотограмметрии (трехмерная реконструкция).
  3. Много лекций по фотограмметрии в компьютерном зрении и не только.

Телеграм-канал

DeepSchool

Короткие посты по теории ML/DL, полезные
библиотеки и фреймворки, вопросы с собеседований
и советы, которые помогут в работе

Открыть Телеграм

Увидели ошибку?

Напишите нам в Telegram!