【Lidar】Python实现点云CSF布料滤波算法提取地面点

        这两天会持续更新一下Python处理点云数据的教程,大家可以点个关注。今天给大家分享一下点云的经典算法:CSF布料模拟算法。

1 CSF算法简介

        CSF算法,全称为Cloth Simulation Filtering,是一种基于欧几里得空间中最小生成树思想的聚类算法,它可以很好地对点云数据进行分割和分类。这个算法的核心思想是把点云数据转化成一张图,然后通过逐步连接最近邻点构建出多棵生成树,再将所有生成树合并成一张图,并利用深度优先搜索、双向广搜等手段对其上点进行分割。这样就可以将点云数据快速分割成多个类别,并且获取到每个点所属的类别。

        在CSF算法的基础上,可以使用其地面点滤波方法。具体方法是通过使用RANSAC算法估计地面模型的法向量,然后通过计算每个点到地面模型的距离来滤除非地面点,而最后剩下的点即为地面点。同时,需要在此基础上做一些修改来提高算法的效率:首先,将待处理的点云数据进行降采样,减少计算量;其次,使用KD树快速搜索每个点的最近邻点,加速点云数据的处理过程。

        此外,CSF算法也可以结合其他技术进行优化,例如在数据预处理阶段使用数据降维技术,减少数据量;在生成树构建阶段使用多线程并行计算,提高计算效率;在分割阶段使用机器学习算法,提高分割精度等。

        总之,CSF算法是一种基于图模型的聚类算法,适用于点云数据的分割和分类任务。通过与其他技术的结合,可以实现更高效、更精确的点云数据处理。

2 代码实现

2.1 项目地址

        我这里的CSF算法是直接用了大佬的包,大家可以自行去下载,然后pip install安装即可。项目地址:GitHub - jianboqi/CSF

2.2 代码展示

        我这里使用的是laspy库打开的点云文件,所以只支持.las格式的点云。你们也可以换成open3d库,这样就可以实现其他格式点云的CSF算法咯。

# -*- coding: utf-8 -*-
"""
@Time : 2023/11/30 14:11
@Auth : RS迷途小书童
@File :Las Data CSF.py
@IDE :PyCharm
@Purpose:点云数据CSF布料算法
"""
import laspy
import CSF
import numpy as np
import open3d as o3ddef csf_las(file=r"Z:\Personal\彭俊喜\Lidar_try/2.las", outfile=r"Z:\Personal\彭俊喜\Lidar_try/out1.las"):las = laspy.read(file)  # read a las filepoints = las.pointsxyz = np.vstack((las.x, las.y, las.z)).transpose()  # extract x, y, z and put into a list  # 点云的空间位置# ---------------------------CSF参数设置---------------------------csf = CSF.CSF()csf.params.bSloopSmooth = False  # 粒子设置为不可移动csf.params.cloth_resolution = 0.1  # 布料网格分辨率2csf.params.rigidness = 3  # 布料刚性参数2csf.params.time_step = 0.65  # 步长csf.params.class_threshold = 0.03  # 点云与布料模拟点的距离阈值0.5csf.params.interations = 500  # 最大迭代次数500# more details about parameter: http://ramm.bnu.edu.cn/projects/CSF/download/csf.setPointCloud(xyz)ground = CSF.VecInt()  # 地面点索引列表non_ground = CSF.VecInt()  # 非地面点索引列表csf.do_filtering(ground, non_ground)  # 执行滤波函数# ---------------------------laspy库保存----------------------------out_file = laspy.LasData(las.header)out_file.points = points[np.array(ground)]  # extract ground points, and save it to a las file.out_file.write(outfile)# ---------------------------open3d库保存---------------------------"""pcd = o3d.geometry.PointCloud()pcd.points = o3d.utility.Vector3dVector(a)pcd1 = o3d.geometry.PointCloud()pcd1.points = o3d.utility.Vector3dVector(b)o3d.io.write_point_cloud(r'Z:/彭俊喜/1.pcd', pcd, write_ascii=False, compressed=False, print_progress=True)o3d.io.write_point_cloud(r'Z:/彭俊喜/2.pcd', pcd1, write_ascii=False, compressed=False, print_progress=True)"""return xyz[ground], xyz[non_ground]# 返回地面点和非地面点的数组def show_point(np1, np2):pcd = o3d.geometry.PointCloud()pcd.points = o3d.utility.Vector3dVector(np1)pcd1 = o3d.geometry.PointCloud()pcd1.points = o3d.utility.Vector3dVector(np2)# 数组转点云pcd.paint_uniform_color([0, 1, 0])  # 自定义颜色pcd1.paint_uniform_color([1, 0, 0])  # 自定义颜色o3d.visualization.draw_geometries([pcd], window_name='ground')o3d.visualization.draw_geometries([pcd1], window_name='tree')# o3d.visualization.draw_geometries([pcd], window_name='Point Cloud View', width=1920, height=1080, left=50, top=50,# point_show_normal=False, mesh_show_wireframe=False, mesh_show_back_face=False)if __name__ == "__main__":gd, non_gd = csf_las()show_point(gd, non_gd)

2.3 效果展示

3 总结

        目前我就使用了Open3D和Laspy两个库去处理点云数据,个人觉得这两个库还是挺不错的,后面也会持续更新更多的Python处理点云数据的教程,如点云聚类、单木分割等。如果感兴趣可以关注我,目前没有设为收费专栏的想法,大家可以放心学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/257736.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美颜SDK算法是什么?美肤、滤镜与实时处理技术讲解

美颜SDK的出现,为开发者提供了一种方便、高效的方式,使其能够轻松地将先进的美颜算法集成到各种应用中。本文将深入探讨美颜SDK算法的本质,以及其在美肤、滤镜与实时处理等方面的技术讲解。 一、美颜SDK算法简介 美颜SDK算法是一套通过计算…

Linux 常用命令汇总

1 linux定时任务 查看定时任务:crontab -l 每晚一点半执行定时任务: 30 1 * * * sh /var/lib/pgsql/pg_db_backup.sh >> /var/lib/pgsql/pg_db_backup.log 2>&1 配置定时任务:crontab -e 2 linux 内核版本查询 cat /etc/r…

Java 中 char 和 Unicode、UTF-8、UTF-16、ASCII、GBK 的关系

Unicode、UTF-8、UTF-16、UTF-32、ASCII、GBK、GB2312、ISO-8859-1 它们之间是什么关系? 关于这几种字符编码的关系,经过各种资料研究,总结如下图(请右键在新标签页打开查看或者下载后使用看图工具放大查看): 我们应该从历史的顺序看待这些字符编码的由来: ASCII(早期…

二十一章(网络通信)

计算机网络实现了多台计算机间的互联,使得它们彼此之间能够进行数据交流。网络应用程序就是在已连接的不同计算机上运行的程序,这些程序借助于网络协议,相互之间可以交换数据。编写网络应用程序前,首先必须明确所要使用的网络协议…

“身份证信息批量核验:高效解决管理难题,轻松提升工作效率“

尊敬的读者们,您是否曾经因为身份证信息的核验而感到烦恼?是否曾经因为手动核验而感到繁琐和耗时?现在,我们向您介绍一款全新的工具——身份证信息批量核验器,它将帮助您一键解决管理难题,让工作事半功倍&a…

【PyTorch】 暂退法(dropout)

文章目录 1. 理论介绍2. 实例解析2.1. 实例描述2.2. 代码实现2.2.1. 主要代码2.2.2. 完整代码2.2.3. 输出结果 1. 理论介绍 线性模型泛化的可靠性是有代价的,因为线性模型没有考虑到特征之间的交互作用,由此模型灵活性受限。泛化性和灵活性之间的基本权…

整理了一些WPF的布局

在Grid里对一个TextBox定位 <Grid ShowGridLines"True"><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition/><…

linux的定时任务Corntab

安装crontab # yum安装crontab yum install -y crontab# 开机自启crond服务并现在启动 systemctl enable --now crondcron系统任务调度 系统任务调度&#xff1a; 系统周期性所要执行的工作&#xff0c;比如写缓存数据到硬盘、日志清理等。 在/etc/crontab文件&#xff0c;这…

selenium 解决 id定位、class定位中,属性值带空格的解决办法

一、前置说明 selenium遇到下面这种元素&#xff1a; <th id"demo id" class"value1 value2 value3 ">1、虽然id一般不会有空格&#xff0c;但是前端错误的这种写法(如下图)&#xff0c;会造成使用id定位不到元素&#xff0c;如&#xff1a; find…

新生儿出生缺陷筛查的关键注意事项

引言&#xff1a; 新生儿的出生缺陷是一个复杂而广泛的问题&#xff0c;及早的筛查和诊断对于预防和管理这些缺陷至关重要。出生缺陷可能涉及各个系统&#xff0c;包括心脏、神经、遗传等&#xff0c;因此及时而全面的筛查对新生儿的健康至关重要。本文将深入探讨新生儿出生缺…

力扣题:字符的统计-12.6

力扣题-12.6 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;696. 计数二进制子串 解题思想&#xff1a;先统计连续的0和连续的1的个数&#xff0c;然后进行相加即可&#xff08;想不到一点&#xff09; class Solution(object):def countBinaryS…

L1-027:出租

题目描述 下面是新浪微博上曾经很火的一张图&#xff1a; 一时间网上一片求救声&#xff0c;急问这个怎么破。其实这段代码很简单&#xff0c;index数组就是arr数组的下标&#xff0c;index[0]2 对应 arr[2]1&#xff0c;index[1]0 对应 arr[0]8&#xff0c;index[2]3 对应 arr…