Матрица проекции камеры набора данных Китти
Я смотрю на набор данных Kitti и, в частности, как преобразовать точку мира в координаты изображения. Я посмотрел на README, и ниже написано, что мне нужно сначала преобразовать в координаты камеры, а затем умножить на матрицу проекции. У меня есть 2 вопроса, не из компьютерного зрения
- Я посмотрел на числа из calib.txt и, в частности, матрица 3x4 с ненулевыми значениями в последнем столбце. Я всегда думал, что эта матрица
= K[I|0]
где K - собственная матрица камеры. Итак, почему последний столбец ненулевой и что это значит? например, P2
array([[7.070912e+02, 0.000000e+00, 6.018873e+02, 4.688783e+01], [0.000000e+00, 7.070912e+02, 1.831104e+02, 1.178601e-01], [0.000000e+00, 0.000000e+00, 1.000000e+00, 6.203223e-03]])
- После применения проекции в [u,v,w] и деления u, v на w, находятся ли эти значения относительно начала координат в центре изображения или начала координат в верхнем левом углу изображения?
ПРОЧТИ МЕНЯ:
calib.txt: данные калибровки для камер: P0/P1 - матрицы проекций 3x4 после выпрямления. Здесь P0 обозначает левую, а P1 обозначает правую камеру. Tr преобразует точку из координат велодина в систему координат левой выпрямленной камеры. Чтобы отобразить точку X из сканера велодина в точку x на i-й плоскости изображения, вам необходимо преобразовать ее следующим образом:
x = Pi * Tr * X
0 ответов
Ссылки:
- Как понять файлы калибровки камеры KITTI?
- Формат параметров в файле калибровки KITTI
- http://www.cvlibs.net/publications/Geiger2013IJRR.pdf
Ответ:
Я настоятельно рекомендую вам прочитать эти ссылки выше. Они могут решить большинство, если не все, ваши вопросы.
По вопросу 2: точки на изображениях проецируются относительно начала координат вверху слева. См. Ссылки 2 и 3, координаты дальней трехмерной точки изображения: (center_x
, center_y
), значения которых указаны в P_rect
матрицы. Или вы можете проверить это с помощью простых кодов:
import numpy as np
p = np.array([[7.070912e+02, 0.000000e+00, 6.018873e+02, 4.688783e+01],
[0.000000e+00, 7.070912e+02, 1.831104e+02, 1.178601e-01],
[0.000000e+00, 0.000000e+00, 1.000000e+00, 6.203223e-03]])
x = [0, 0, 1E8, 1] # A far 3D point
y = np.dot(p, x)
y[0] /= y[2]
y[1] /= y[2]
y = y[:2]
print(y)
Вы увидите что-то вроде:
array([6.018873e+02, 1.831104e+02 ])
что совсем рядом с (p[0, 2], p[1, 2])
, иначе (center_x
, center_y
).
Для всех матриц P (3x4) они представляют:
P(i)rect = [[fu 0 cx -fu*bx],
[0 fv cy -fv*by],
[0 0 1 0]]
Последний столбец является исходными линии в метрах WRT эталонной камеры 0. Вы можете увидеть P0 имеют все нули в последнем столбце, потому что это ссылка камера.
В этом посте есть более подробная информация: как рассчитывалась калибровочная матрица Kitti?