点云处理学习笔记-剔除kitti数据集中的地面点云

利用RANSAC进行地面点云的剔除

本文利用sklearn中的RANSACRegressor来对Kitti自动驾驶数据集中的点云数据进行地面数据剔除。本文主要分为四个部分:

  • 点云数据读取与转换
  • 高度滤波
  • 点云剔除
  • 结果可视化

代码中需要用到的库如下:

import numpy as np
import os
import struct
import open3d as o3d
import numpy as np
from sklearn.linear_model import RANSACRegressor
from sklearn.linear_model import LinearRegression

点云数据的读取与转换

本文定义read_velodyne_bin(path)函数来读取Kitti数据集中的.bin二进制文件,函数先对原始数据进行读取,然后对数据进行解码并将数据转化为np.array,具体的代码实现如下:

def read_velodyne_bin(path):
    pc_list = []
    with open(path, 'rb') as f:
        content = f.read()
        pc_iter = struct.iter_unpack('ffff', content)
        for idx, point in enumerate(pc_iter):
            pc_list.append([point[0], point[1], point[2]])
    return np.asarray(pc_list, dtype=np.float32)

对该函数进行测试,代码如下,本文将Kitti数据集中的一帧取出,放置于当前目录下:

points=read_velodyne_bin('./000000.bin')
pc = o3d.geometry.PointCloud()
pc.points = o3d.utility.Vector3dVector(points)
o3d.visualization.draw_geometries([pc])

测试结果如下:
在这里插入图片描述

高度滤波

先用可以提前获取的高度信息,粗粒度的剔除一些无关的点云数据, 这里使用-0.57作为分割值来对点云数据进行切片处理(可以多尝试几个数据,也可以得到一些关于数据的统计信息来设置初值),代码如下:

points=np.asarray([  data  for data in points_f if data[2]<-0.57])
points_idx=np.asarray([  data_idx  for data_idx, data in enumerate(points_f)  if data[2]<-0.57])
pc = o3d.geometry.PointCloud()
pc.points = o3d.utility.Vector3dVector(points)
o3d.visualization.draw_geometries([pc])

切片处理后的点云数据如下图所示:
请添加图片描述

点云剔除

本文采用RANSAC聚类,通过计算点到拟合平面的距离来对地面点云进行剔除,具体的代码如下:

# 提取特征(X)和目标变量(y)
X = points[:, :2]  # 使用前两个坐标作为特征
y = points[:, 2]    # 使用第三个坐标作为目标变量

# 创建基本估计器
base_estimator = LinearRegression()

# 创建RANSACRegressor
ransac = RANSACRegressor(estimator=base_estimator, min_samples=10, residual_threshold=0.4, random_state=42)

# 拟合数据
ransac.fit(X, y)
inlier_mask=ransac.inlier_mask_
outlier_mask=np.logical_not(inlier_mask)

最后对分割结果进行可视化处理:

del_idx=points_idx[inlier_mask]
filted_points=np.delete(points_f,del_idx,axis=0)
#filted_points=[f_p for i, f_p in enumerate(points_f) if i not in del_idx ]
pc = o3d.geometry.PointCloud()
pc_g=o3d.geometry.PointCloud()
pc_g.points=o3d.utility.Vector3dVector(points[inlier_mask])
pc_g.paint_uniform_color([0,0,1])
pc.points = o3d.utility.Vector3dVector(filted_points)
pc.paint_uniform_color([0,1,0])
o3d.visualization.draw_geometries([pc,pc_g])

最后的效果图如下,其中蓝色为地面,绿色为其他部分:
请添加图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Kitti是一个广泛使用的地面点云数据集,用于自动驾驶和机器人感知研究。该数据集由德国卡尔斯鲁厄理工学院和丰田美国技术研究所共同创建。 Kitti数据集包含来自城市环境的采样激光雷达(LiDAR)和相机图像数据。这些数据从移动车辆的感知系统获得,包括音频、雷达和GPS定位等传感器。数据集涵盖了不同的驾驶场景,如城市街道、高速公路和乡村道路,包括白天和夜间的环境。 地面点云数据是一种基于激光雷达扫描获得的点云信息,用于描述地面上的物体和环境。在Kitti数据集地面点云数据被广泛应用于道路和地形的建模、障碍物检测和车道线提取等研究。利用地面点云数据,算法和模型可以识别出道路上的车辆、行人、建筑物等对象,并进行环境感知和决策。 进行地面点云数据处理需要使用特定的软件和算法。研究人员可以使用开源工具如PCL(点云库)或自行开发算法处理Kitti数据集地面点云数据。这些算法可以对点云数据进行滤波、分割、分类和重建等操作,以获取有关道路和环境的详细信息。 总之,Kitti数据集地面点云数据为自动驾驶和机器人感知研究提供了宝贵的资源。通过对这些数据进行处理和分析,研究人员可以开发出更准确和可靠的感知算法,以实现更安全和智能的自动驾驶系统。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mezdh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值