Матрица проекции камеры набора данных Китти

Я смотрю на набор данных Kitti и, в частности, как преобразовать точку мира в координаты изображения. Я посмотрел на README, и ниже написано, что мне нужно сначала преобразовать в координаты камеры, а затем умножить на матрицу проекции. У меня есть 2 вопроса, не из компьютерного зрения

  1. Я посмотрел на числа из 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]])
  1. После применения проекции в [u,v,w] и деления u, v на w, находятся ли эти значения относительно начала координат в центре изображения или начала координат в верхнем левом углу изображения?

ПРОЧТИ МЕНЯ:

calib.txt: данные калибровки для камер: P0/P1 - матрицы проекций 3x4 после выпрямления. Здесь P0 обозначает левую, а P1 обозначает правую камеру. Tr преобразует точку из координат велодина в систему координат левой выпрямленной камеры. Чтобы отобразить точку X из сканера велодина в точку x на i-й плоскости изображения, вам необходимо преобразовать ее следующим образом:

  x = Pi * Tr * X

0 ответов

Ссылки:

  1. Как понять файлы калибровки камеры KITTI?
  2. Формат параметров в файле калибровки KITTI
  3. 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?

Другие вопросы по тегам