【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 o3d


def 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 file
    points = las.points
    xyz = 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  # 布料网格分辨率2
    csf.params.rigidness = 3  # 布料刚性参数2
    csf.params.time_step = 0.65  # 步长
    csf.params.class_threshold = 0.03  # 点云与布料模拟点的距离阈值0.5
    csf.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处理点云数据的教程,如点云聚类、单木分割等。如果感兴趣可以关注我,目前没有设为收费专栏的想法,大家可以放心学习。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是网站?

这篇文章是我学习网站开发,阶段性总结出来的。可以帮助你 通俗易懂 地更加深刻理解网站的这个玩意。 一,网站和网页的区别? 网站是由一个个网页组成。我们在浏览器上面看到的每一个页面就是网页,这些 相关的 网页组成一个网站。…

【Selenium+Webmagic】基于JAVA语言实现爬取js渲染后的页面,附有代码

事先声明 笔者最近需要查看一些数据,自己挨个找太麻烦了,于是简单的学了一下爬虫。笔者在这里声明,爬的数据只为学术用,没有其他用途,希望来这篇文章学习的同学能抱有同样的目的。 枪本身不坏,坏的是使用枪…

EOCR-CT电流互感器与SR-CT区别简介

电流互感器CT是(Current Transformers)的缩写,是将一次测的大电流,按比列变为适合通过测量仪表或保护装置的变换设备。 EOCR外部电流互感器3CT和SR-CT是专为保护大负载的组合使用,电流变比100:5&#xff0…

如何部署自己的服务渲染页面为Pdf文档

前言 相信大家都觉得官方发布的文档生成模块https://docs.mendix.com/appstore/modules/document-generation/很有用,它能把Mendix页面像素级导出到Pdf文件中,这对于归档等业务非常有价值。但部署依赖公有云提供的渲染服务,而中国本土用户对…

常用API(一)

API(全称 Application Programming Interface:应用程序编程接口) 就是别人写好的一些程序,给我们直接拿去调用即可解决问题的。 包 什么是包? 包是用来分门别类的管理各种不同程序的,类似于文件夹,建包有利于程序的管…

python数据分析总结(pandas)

目录 前言 df导入数据 df基本增删改查 数据清洗 ​编辑 索引操作 数据统计 行列操作 ​编辑 df->types 数据格式化 ​编辑 日期数据处理 前言 此篇文章为个人python数据分析学习总结,总结内容大都为表格和结构图方式,仅供参考。 df导入数…

在线教育小程序正在成为教育行业的新生力量

教育数字化转型是目前教育领域的一个热门话题,那么到底什么是教育数字化转型?如何做好教育数字化转型? 教育数字化转型是利用信息技术和数字工具改变和优化教育的过程。主要特征包括技术整合、在线学习、个性化学习、大数据分析、云计算、虚拟…

视频封面提取:精准截图,如何从指定时长中提取某一帧图片

在视频制作和分享过程中,一个有吸引力的封面或截图往往能吸引更多的观众点击观看。有时候要在特定的时间段内从视频中提取一帧作为封面或截图。如果每个视频都手动提取的话就会耗费很长时间,那么如何智化能批量提取呢?现在一起来看下云炫AI智…

VUE2+THREE.JS 按照行动轨迹移动人物模型并相机视角跟随人物

按照行动轨迹移动人物模型并相机视角跟随人物 1. 初始化加载模型2. 开始移动模型3. 人物模型启动4. 暂停模型移动5. 重置模型位置6. 切换区域动画7. 摄像机追踪模型8. 移动模型位置9.动画执行 人物按照上一篇博客所设定的关键点位置,匀速移动 1. 初始化加载模型 //…

选择护眼台灯的标准,符合国家最高标准的护眼台灯推荐

据中国国家卫生健康委员会发布的报告,2020年全国青少年近视率为53.6%,其中,小学生近视率为38.1%,初中生近视率为71.6%,高中生近视率为81.0%。这意味着中国青少年中,大多数人都存在不同程度的近视问题&#…

【Java用法】Lombok中@SneakyThrows注解的使用方法和作用

Lombok中SneakyThrows注解的使用方法和作用 一、SneakyThrows的作用二、SneakyThrows注解原理 一、SneakyThrows的作用 普通Exception类,也就是我们常说的受检异常或者Checked Exception会强制要求抛出它的方法声明throws,调用者必须显示的去处理这个异常。设计的目…

如何使用eXtplorer+cpolar内网穿透搭建个人云存储实现公网访问

文章目录 1. 前言2. eXtplorer网站搭建2.1 eXtplorer下载和安装2.2 eXtplorer网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1. 前言 通过互联网传输文件,是互联网最重要的应用之一,无论是…

Mybatis源码解析2:全局配置

Mybatis源码解析2:全局配置 1.项目结构2. 源码分析2.1.SqlSessionFactoryBuilder#build(java.io.InputStream)2.2 XMLConfigBuilder构造器2.3 解析XMLConfigBuilder#parse2.4 解析配置 XMLConfigBuilder#parseConfiguration 1.项目结构 源码地址: 项目结…

MySQL-日期时间函数详解及练习

目录 3.1 返回当前日期 3.2 提取日期部分 3.3 增加或减去时间 3.4 格式化时期或时间 3.5 牛客练习题 3.1 返回当前日期 1. CURDATE() 或 CURRENT_DATE() | 返回当前日期 select curdate();select current_date(); 结果: 2. CURTIME() 或 CURRENT_TIME() | 返…

【PyTorch】 暂退法(dropout)

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

STM32-EXTI外部中断

一、中断系统 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行 中断优先级&#xff…

2021年第十届数学建模国际赛小美赛B题疾病传播的风险解题全过程文档及程序

2021年第十届数学建模国际赛小美赛 B题 疾病传播的风险 原题再现: 空气传播疾病可以通过咳嗽或打喷嚏、喷洒液体或灰尘传播。另一方面,一些常见的传染病只能通过飞沫传播。请建立一个模型,以评估密闭空间内空气传播和液滴传播疾病的可能性。…

查看电脑cuda版本

1.找到NVODIA控制面板 输入NVIDIA搜索即可 出现NVIDIA控制面板 点击系统信息 2.WINR 输入nvidia-smi 检查了一下,电脑没用过GPU,连驱动都没有 所以,装驱动…… 选版本,下载 下载后双击打开安装 重新输入nvidia-smi 显示如下…

喜讯:加速度商城系统全系列产品品牌全新升级为Shopfa

2月1日讯:经过1年多的品牌文化塑造,深圳市加速度软件开发有限公司经过研究决定,将旗下的多商户商城系列、小程序商城系列、B2B商城系列、供应商集采系列、电子元器件商城系列、跨境独立站商城系列、MRO工业品商城系列、外卖商城系列、智慧零售…

C++笔记:动态内存管理

文章目录 语言层面的内存划分C语言动态内存管理的缺陷new 和 delete 的使用了解语法new 和 delete 操作内置类型new 和 delete 操作自定义类型 new 和 delete 的细节探究new 和 delete 的底层探究operator new 和 operator new[]operator delete 和 operator delete[] 显式调用…