Геометрия камеры и модель обскуры

Калибровка камеры или обратная засечка камеры оценивают параметры модели камеры-обскуры по данной фотографии. Обычно параметры камеры-обскуры представлены в матрице 3 × 4, называемой матрицей камеры. Мы используем эти параметры, чтобы оценить фактический размер объекта или определить местоположение камеры в мире.

Как

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

Почему мне нужно знать о камере-обскуре?

Потому что это суть того, как работает любая камера. Модель камеры-обскуры объясняет взаимосвязь между точкой в ​​мире и проекцией на плоскость изображения (датчик изображения).

Как проецировать точки мира на датчик камеры?

Модель Пинхола

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

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

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

[Пример] Реальное изображение с разным размером диафрагмы

Два самых важных параметра в модели камеры-обскуры

  1. Фокусное расстояние: расстояние между отверстием и плоскостью изображения.

Это влияет на размер проецируемого изображения. Это влияет на фокус камеры при использовании линз.

2. Центр камеры. Координаты центра точечного отверстия.

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

Фокусное расстояние и центр камеры - это внутренние параметры камеры, K. (K - это отраслевая норма для выражения внутренней матрицы.)

Внутренние параметры

(Она же матрица камеры.)

(C x, Cy): центр камеры в пикселях.
(fx, fy): фокусное расстояние в пикселях.

fx = F/px
fy = F/py

F: фокусное расстояние в мировых единицах (например, миллиметрах).

(P x, P y): размер пикселя в мировых единицах.

s: коэффициент перекоса, который не равен нулю, если оси изображения не перпендикулярны.
s = fx tan ( α)

Преобразование системы координат (с помощью матричной алгебры!)

Зачем мы этого хотим?

Чтобы спроецировать точку в мировом кадре на плоскость изображения камеры!

Сделать что?

(Если мы говорим о беспилотных автомобилях) Локализовать беспилотные автомобили!

Свет (отраженный от объекта) распространяется от мира через апертуру камеры (точечное отверстие) к поверхности сенсора. Проекция на поверхность сенсора через апертуру приводит к перевернутым изображениям. Чтобы избежать путаницы с переворачиванием, мы определяем виртуальную плоскость изображения (желтую плоскость) перед центром камеры.

# World Coordinate System 
Oworld = [Xw, Yw, Zw]
# Camera Coordinate System
Ocamera = [Xc, Yc, Zc]
# Pixel Coordinate System
Oimage = [u,v]

Мы определяем матрицу поворота 3 на 3 (R) и вектор перемещения 3 на 1 (t) в чтобы смоделировать ЛЮБУЮ трансформацию между мировой системой координат и другой.

Теперь мы можем сформулировать проблему проекции (Мировые координаты → Координаты изображения) как

  1. Мировые координаты → Координаты камеры
  2. Координаты камеры → Координаты изображения
Oworld [Xw,Yw,Zw]  Oimage [u,v]

Как? с помощью линейной алгебры!

1. World coordinates →  Camera coordinates
Ocamera = [R|t] * Oworld
2. Camera coordinates → Image coordinate
Oimage = K * Ocamera 
Remind me what K (camera intrinsic parameter) was?

Оба шага 1 и 2 - это просто умножение матриц. Поэтому его можно переписать (объединить) как:

Oimage = P * Oworld = K[R|t] * Oworld
Let P = K[R|t]
P as Projection

Подождите, K - это (3,3) матрица. [R | t] равно (3,4). (| означает, что вы объединяете матрицу R с вектором t.) Oworld [Xw, Yw, Zw] равен (3,1).

Тогда вы не сможете умножить K [R | t] (3,4) на Oworld [Xw, Yw, Zw] (3,1)!

😎 Мы можем решить эту проблему, добавив единицу в конце вектора Oworld [Xw, Yw, Zw, 1], который называется однородной координатой (или проективной координатой).

Если вы хотите дополнительно преобразовать координаты изображения в пиксельные координаты: разделите x и y на z, чтобы получить однородные координаты в плоскости изображения.

[x, y, z] -> [u, v, 1] = 1/z * [x, y, z]

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

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

Несколько замечаний:

а) матрица вращения (R) и вектор перемещения (t) называются внешней параметры, поскольку они «внешние» по отношению к камере.

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

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

c) Координата изображения (виртуальная плоскость изображения) [u, v] начинается с верхнего левого угла виртуальной плоскости изображения. Вот почему мы корректируем расположение пикселей в соответствии с рамкой координат изображения.

Видеть значит верить

Взгляните на функцию project_ego_to_image. Он вызывает две функции подряд, сначала project_ego_to_cam, затемproject_cam_to_image, точно так же, как мы преобразовали мировую координату в координату изображения, разбив ее на 2 этапа: Мировые координаты → Координаты камеры, затем Координаты камеры → Координата изображения.

cart2hom преобразует декартовы координаты в однородные координаты.

Приведенный выше фрагмент кода взят из argoverse-api.



В блокноте jupyter ниже вы можете увидеть, как ручной расчет (проекция облака точек из мира в плоскость изображения) совпадает с результатом argoverse api.

Код: https://github.com/aerinkim/TowardsDataScience/blob/master/Camera%20Calibration%20Argoverse.ipynb