【问题标题】:Kitti Velodyne point to pixel coordinateKitti Velodyne 点到像素坐标
【发布时间】:2018-01-02 04:18:06
【问题描述】:

从 Velodyne 点,如何获取每个相机的像素坐标?

使用pykitti point_cam0 = data.calib.T_cam0_velo.dot(point_velo) 我们可以得到图像上的投影,即Kitti Dataset paper的方程7:

y = Prect(i) Rrect(0) Tvelo子>凸轮 x

但是从那里,如何获取每张图像上的实际像素坐标?

【问题讨论】:

    标签: projection camera-calibration lidar


    【解决方案1】:

    更新: PyKitti 0.2.1 版公开了所有相机的投影矩阵。

    我最近遇到了同样的问题。对我来说,问题是 pykitty 没有为所有相机公开 Prect 和 Rrect 矩阵。

    对于 Pykitti > 0.2.1,使用校准数据中的 Prect 和 Rrect

    对于以前的版本,您有两种选择:

    1. 手动输入矩阵(数据在每个序列的 .xml 校准文件中)。
    2. 使用 pykitti 的这个分支:https://github.com/Mi-lo/pykitti/

    然后,您可以使用公式 7 将 velodyne 点投影到图像中。请注意:

    • 您将需要 3D 点作为齐次坐标中的 4xN 数组。 pykitti 返回的点是一个 Nx4 numpy 数组,反射率在第 4 列。您可以使用下面的 prepare_velo_points 函数准备点,该函数只保留反射率 > 0 的点,然后将反射率值替换为 1 以获得齐次坐标。

    • velodyne 是 360°。即使对于相机后面的点,公式 7 也会为您提供结果(它们将像在前面一样被投影,但垂直镜像)。为避免这种情况,您应该只投影相机前面的点。为此,您可以使用下面的函数 project_velo_points_in_img。它返回齐次坐标中的 2d 点,因此您应该丢弃第 3 行。

    以下是我使用的函数:

    def prepare_velo_points(pts3d_raw):
        '''Replaces the reflectance value by 1, and tranposes the array, so
           points can be directly multiplied by the camera projection matrix'''
    
        pts3d = pts3d_raw
        # Reflectance > 0
        pts3d = pts3d[pts3d[:, 3] > 0 ,:]
        pts3d[:,3] = 1
        return pts3d.transpose()
    
    def project_velo_points_in_img(pts3d, T_cam_velo, Rrect, Prect):
        '''Project 3D points into 2D image. Expects pts3d as a 4xN
           numpy array. Returns the 2D projection of the points that
           are in front of the camera only an the corresponding 3D points.'''
    
        # 3D points in camera reference frame.
        pts3d_cam = Rrect.dot(T_cam_velo.dot(pts3d))
    
        # Before projecting, keep only points with z>0 
        # (points that are in fronto of the camera).
        idx = (pts3d_cam[2,:]>=0)
        pts2d_cam = Prect.dot(pts3d_cam[:,idx])
    
        return pts3d[:, idx], pts2d_cam/pts2d_cam[2,:]
    

    希望这会有所帮助!

    【讨论】:

    • pykitti dev here,我刚刚将 version 0.2.1 推送到 pypi。这结合了来自 Milo 的 pull request 以公开原始模块中的投影和校正矩阵,并对里程计模块执行相同的操作。
    • 如何将 velodyne 转换为其中一台摄像机?
    • 感谢您的回复,感谢@Lee 提供 pykitti。感谢您的代码,我发现最终的图像向量必须通过除以第三个向量条目来进行归一化。 kitti 文档中没有提到这一点,这让我非常困惑。
    猜你喜欢
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    相关资源
    最近更新 更多