如何利用投影矩阵从KITTI获取鸟瞰图?

2024-05-19 00:21:49 发布

您现在位置:Python中文网/ 问答频道 /正文

目标是从KITTI图像(数据集)中获取鸟瞰图,我有投影矩阵(3x4)。在

有很多方法可以生成转换矩阵。对于鸟瞰图,我读过一些数学表达式,比如:

H12=H2*H1-1=ARA-1=p*A-1 inOpenCV - Projection, homography matrix and bird's eye view

x=Pi*Tr*x in kitti dataset camera projection matrix

但这些选择都不符合我的目的。在

PYTHON代码

将numpy作为np导入 进口cv2

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

最大高度,最大宽度=图像.形状[:2]

M有3x4个维度

M=np.数组([721.5377,0.0,609.5593,44.85728],[0.0,721.5377,72.854,0.2163791],[0.0,0.0,1.0,.002745884]))

这里需要一个3x3维的M矩阵

翘曲=cv2。翘曲透视(图像,M,(最大宽度,最大高度))

显示原始图像和扭曲图像

cv2.imshow(“原始”,图像)

cv2.imshow(“扭曲”,扭曲)

cv2.waitKey(0)

我需要知道如何管理投影矩阵来获得鸟瞰图。在

到目前为止,我所尝试的一切都会给我带来扭曲的图像,甚至没有接近我需要的信息。在

This is a example of image from the KITTI database.

This is other example of image from the KITTI database.

在左边,图像显示了3D(上图)和2D(下图)中检测汽车的图像。右边是我想要的鸟瞰图。因此,我需要得到转换矩阵来转换划分汽车的盒子的坐标。在


Tags: 图像image宽度高度isexamplenp矩阵
1条回答
网友
1楼 · 发布于 2024-05-19 00:21:49

下面是我手动构建鸟瞰视图转换的代码:

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:鸟瞰图像的分辨率。XY平面上1米的距离将转换为鸟瞰图像中的pixelPerMeter像素。
  • origin:相机在鸟瞰图中的位置

您可以将转换矩阵作为cv::initUndistortRectifyMaps()传递给newCameraMatrix,然后使用cv::remap创建鸟瞰图。在

相关问题 更多 >

    热门问题