繁体   English   中英

如何通过投影矩阵从 KITTI 获得鸟瞰图?

[英]How to get Bird's Eye View from KITTI by Projection Matrix?

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

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

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

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

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

PYTHON 代码

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

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

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。 在此 function 中,仅使用mCameraToCarMatrix的旋转部分。
  • mIntrinsicMatrix : 保存相机内在参数的 3x3 矩阵
  • cameraPosition()[2] : 汽车坐标系中相机的 Z 坐标(高度)。 它与mCameraToCarMatrix(2,3)相同。

function参数:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM