将lidar点云转化成为图片1

将lidar转化成为图片有很多种方法, 最近在思考如何根据自己设定的相机的角度来查看点云.

大致的想法是,输入lidar点云,以及从lidar到相机的pose, 这个pose,即沿着三个轴的旋转以及平移,可以是任意的,是人为指定的. 然后输出的是相机在这个pose下所拍摄到的相机的图片.

如果这个想法能够实现,就能够从不同的角度看点云形成的图片,比如第一人称视角,或者俯视图等.

以kitti为例

kitti raw的数据采集车是这样的.
在这里插入图片描述

因为只有点云的话,不太好看第一人称的点云是怎么样的, 这里以相机俯视的角度来看.

那么第一步就是要传入相机的变换了.

即如何从


变到下面的

* ------->x
|
|
|
y

其中 *代表着z轴穿过纸向里.

有两种方式都可以实现

rx:0
ry:180
rz:90
和
rx:180
ry: 0
rz: 270

先解释一下,
后三行,
即先绕着x轴转180度,这个不用区分是顺时针,结果都一样.
然后rz=270度,指的是
在这里插入图片描述
右手坐标系下,即大拇指z-向上时,食指x向前,中指y向左时,逆时针绕z轴旋转270度.即从x转到y的方向.

前三行的rz:90指的是也是在上面的右手坐标系下, 沿着食指向中指的转动方向,转动 90度.

这样的话,相机就朝下看了,假设相机位置和lidar位置重合,即 tx,ty,tz=0,那么lidar到相机的pose即为


  def view(self, rx, ry, rz, tx, ty, tz):
        mx = self.rotx(rx)
        my = self.roty(ry)
        mz = self.rotz(rz)
        rotation = np.dot(mz, np.dot(my, mx))
        translation = np.array([tx, ty, tz])
        return self.transform_from_rot_trans(rotation, translation), rotation, translation

这里的

   def rotx(self, t):
        """Rotation about the x-axis."""
        c = np.cos(t)
        s = np.sin(t)
        return np.array([[1,  0,  0],
                         [0,  c, -s],
                         [0,  s,  c]])

    def roty(self, t):
        """Rotation about the y-axis."""
        c = np.cos(t)
        s = np.sin(t)
        return np.array([[c,  0,  s],
                         [0,  1,  0],
                         [-s, 0,  c]])

    def rotz(self, t):
        """Rotation about the z-axis."""
        c = np.cos(t)
        s = np.sin(t)
        return np.array([[c, -s,  0],
                         [s,  c,  0],
                         [0,  0,  1]])

    def transform_from_rot_trans(self, R, t):
        """Transforation matrix from rotation matrix and translation vector."""
        R = R.reshape(3, 3)
        t = t.reshape(3, 1)
        return np.vstack((np.hstack([R, t]), [0, 0, 0, 1]))

最后,先将lidar坐标转化为相机坐标,再由相机坐标转化为像素坐标即可.
以kitti的数据为例.

lidar点云用pcl看的bev如下

在这里插入图片描述
虚拟相机的pose之后,得到的图片如下

在这里插入图片描述

如果单独把tz调高一些的话,即希望相机往lidar的正上方平移2米,得到的如下

在这里插入图片描述
如果继续平移2米的话

在这里插入图片描述

其他的视角也可以得到,比如斜向下45度的角度等等.

这里不再演示.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
利用激光雷达(lidar)进行点云直线提取是一种常见的三维物体建模和环境感知技术。点云是由激光雷达扫描周围环境得到的离散点的集合,它可以提供可靠的细节信息,便于进行直线提取。 点云直线提取的目标是从点云中找到属于直线的点,让我们能够更好地理解和分析场景。这个过程通常包括以下几个步骤: 1. 数据预处理:首先,我们需要对原始点云数据进行预处理。这包括去除离群点、降采样以减少数据量和噪声,以及将点云投影到二维平面上简化处理。 2. 点云分割:接着,我们使用分割算法将点云分成多个子集,每个子集代表一个可能的直线。常见的分割算法包括RANSAC和基于区域生长的方法。 3. 直线拟合:对于每个子集,我们使用最小二乘法或其他拟合算法拟合出最佳直线模型。这些模型由直线参数如斜率、截距等表示。 4. 直线过滤:由于点云数据中可能存在噪声或其他非直线特征,我们需要应用一些过滤技术来排除不符合我们设定的直线模型的点。 5. 直线提取和可视化:最后,我们根据拟合好的直线模型,将属于直线的点从原始点云中提取出来,并进行可视化展示。 点云直线提取在多个领域有着广泛应用,例如机器人感知、无人驾驶、三维建模等。利用激光雷达进行直线提取能够提供精确和可靠的环境信息,为我们进一步的目标检测、路径规划等任务提供有价值的数据基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值