【问题标题】:How to get Bird's Eye View from KITTI by Projection Matrix?如何通过投影矩阵从 KITTI 获得鸟瞰图?
【发布时间】:2019-11-02 05:48:45
【问题描述】:

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

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

H12 = H2*H1-1=ARA-1=P*A-1 in OpenCV - 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')

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]))

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

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

显示原始图像和变形图像

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(下)图像。右边是我想要获得的鸟瞰图。因此,我需要获取变换矩阵来变换分隔汽车的框的坐标。

【问题讨论】:

  • 你能展示其中一张 kitti 鸟瞰图吗?了解您想要实现的目标
  • 我已经在帖子中添加了几张图片。
  • 你想得到右边的图像吗?只需在相机图像的地平面上定义 4 个点,在鸟瞰图像上定义相应的 4 个点,然后 getPerspectiveTransform 即可获得转换。
  • 如果您有 3d 坐标中的框,只需删除 z 坐标即可获得正交投影。然后缩放并将空间转换为您想要的图像空间。
  • 我不想使用 4 点法,因为我必须处理数英里的帧,每个帧都提供自己的投影矩阵值。这就是我想使用那个矩阵的原因,我想这样我会得到更准确的结果。

标签: python opencv matrix-transform kitti


【解决方案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-right、y-down、z-forward。汽车的轴是 x-forward、y-left、z-up。在此函数中,仅使用了 mCameraToCarMatrix 的旋转部分。
  • mIntrinsicMatrix:保存相机内在参数的 3x3 矩阵
  • cameraPosition()[2]:汽车坐标系中摄像头的Z坐标(高度)。和mCameraToCarMatrix(2,3)一样。

函数参数:

  • pixelPerMeter:鸟瞰图分辨率。 XY 平面上 1 米的距离将转换为鸟瞰图像中的pixelPerMeter 像素。
  • origin: 鸟瞰图中相机的位置

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

【讨论】:

  • 此代码是否与 KITTI 数据库的图像一起使用?我了解矩阵 R(旋转)和 K(内部)的使用,但是您知道其余变量与 KITTI 提供的投影矩阵之间的关系是什么吗?
  • 这是我来自不同应用程序的源代码。投影矩阵是内在矩阵和从汽车到相机框架的外在变换的乘积。在我的代码中,我会将 P 计算为 P = mIntrinsicMatrix * mCameraToCarMatrix.inv()(cv::Range(0,3), cv::Range(0,4)); 我不确定您是否可以反转它。
  • 问题是我的投影矩阵是3x4,不知道需要什么才能得到一个3x3的变换矩阵。
猜你喜欢
  • 2014-03-20
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
相关资源
最近更新 更多