Как получить с высоты птичьего полета от KITTI с помощью Projection Matrix?

Цель состоит в том, чтобы получить вид с высоты птичьего полета из изображений KITTI (набор данных), а у меня есть матрица проекции (3x4).

Есть много способов генерировать матрицы преобразования. Для Bird's Eye View я читал некоторые математические выражения, например:

H12 = H2 * H1-1 = AR A-1 = P * A-1 в OpenCV - проекция, матрица гомографии и вид с высоты птичьего полета

и x = Pi * Tr * X в матрице проекции камеры набора данных kitti

но ни один из этих вариантов не помог мне.

КОД PYTHON

импортировать numpy как np import cv2

image = cv2.imread('Data / RGB / 000007.png')

maxHeight, maxWidth = image.shape[:2]

М имеет размеры 3х4

M = np.array(([721,5377, 0,0, 609,5593, 44,85728], [0,0, 721,5377, 72,854, 0,2163791], [0,0, 0,0, 1,0, 0,002745884]))

Здесь нужна матрица M размером 3x3.

warped = cv2.warpPerspective(изображение, M, (maxWidth, maxHeight))

показать исходные и деформированные изображения

cv2.imshow("Исходный", изображение)

cv2.imshow("Искаженный", искаженный)

cv2.waitKey(0)

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

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

Это пример изображения из базы данных KITTI.

Это еще один пример изображения из базы данных KITTI.

Слева показаны изображения обнаружения автомобилей в 3D (вверху) и 2D (внизу). Справа вид с высоты птичьего полета, который я хочу получить. Следовательно, мне нужно получить матрицу преобразования, чтобы преобразовать координаты ящиков, разделяющих автомобили.

1 ответ

Вот мой код для ручного создания преобразования с высоты птичьего полета:

cv::Mat1d CameraModel::getInversePerspectiveMapping(double pixelPerMeter, cv::Point const & origin) const {
    double f = pixelPerMeter * cameraPosition()[2];
    cv::Mat1d R(3,3);
    R <<  0, 1, 0,
          1, 0, 0,
          0, 0, 1;

    cv::Mat1d K(3,3);
    K << f, 0, origin.x, 
         0, f, origin.y, 
         0, 0, 1;
    cv::Mat1d transformtoGround = K * R * mCameraToCarMatrix(cv::Range(0,3), cv::Range(0,3));
    return transformtoGround * mIntrinsicMatrix.inv();
}

Переменные / функции-члены, используемые внутри функций:

  • mCameraToCarMatrix: матрица 4x4, содержащая однородное жесткое преобразование из системы координат камеры в систему координат автомобиля. Оси камеры - x-вправо, y-вниз, z-вперед. Оси автомобиля - x-вперед, y-влево, z-вверх. Внутри этой функции только вращающаяся частьmCameraToCarMatrix используется.
  • mIntrinsicMatrix: матрица 3x3, содержащая внутренние параметры камеры
  • cameraPosition()[2]: координата Z (высота) камеры в кадре координат автомобиля. Это то же самое, что иmCameraToCarMatrix(2,3).

Параметры функции:

  • pixelPerMeter: разрешение изображения с высоты птичьего полета. Расстояние в 1 метр в плоскости XY будет соответствоватьpixelPerMeter пикселей на изображении с высоты птичьего полета.
  • origin: положение камеры на изображении с высоты птичьего полета

Вы можете передать матрицу преобразования в cv::initUndistortRectifyMaps() как newCameraMatrix а затем используйте cv::remap для создания изображения с высоты птичьего полета.

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