1

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

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

H12 = H2*H1-1=A R A-1=P*A-1 in OpenCV - 投影、单应矩阵和鸟瞰图

和 x = Pi * Tr * X 在kitti 数据集相机投影矩阵中

但这些选项都不适用于我的目的。

蟒蛇代码

将 numpy 导入为 np 导入 cv2

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

最大高度,最大宽度 = 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(图像, M, (maxWidth, maxHeight))

显示原始图像和变形图像

cv2.imshow("原始", 图片)

cv2.imshow("扭曲", 扭曲)

cv2.waitKey(0)

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

到目前为止,我尝试过的所有事情都会向我抛出扭曲的图像,甚至没有接近我需要的信息。

这是来自 KITTI 数据库的图像示例。

这是来自 KITTI 数据库的另一个图像示例。

左侧显示了检测汽车的 3D(上)和 2D(下)图像。右边是我想要获得的鸟瞰图。因此,我需要获取变换矩阵来变换分隔汽车的框的坐标。

4

1 回答 1

2

这是我手动构建鸟瞰图变换的代码:

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:相机在鸟瞰图像中的位置

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

于 2019-11-02T17:39:39.070 回答