Как получить вид с высоты птичьего полета от KITTI по ​​проекционной матрице? - PullRequest
0 голосов
/ 02 ноября 2019

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

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

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

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

, но ни один из этих вариантов не сработалдля моей цели.

КОД ПИТОНА

импорт numpy как импорт np cv2

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

maxHeight, maxWidth = image.shape [: 2]

M имеет размеры 3x4

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, .002745884]))

Здесь необходима M-матрица с размерами 3x3

warped = cv2.warpPerspective (image, M, (maxWidth, maxHeight))

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

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

cv2.imshow ("Деформированный", деформированный)

cv2.waitKey (0)

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

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

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

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

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

1 Ответ

1 голос
/ 02 ноября 2019

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

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 для создания изображения с высоты птичьего полета.

...