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