pclpy Ransac平面分割算法输出的索引从点云中提取点云的子集

pclpy Ransac平面分割算法输出的索引从点云中提取点云的子集

      • 一、算法原理
      • 二、代码
      • 三、结果
          • 1.`sor`统计滤波
          • 2.`Ransac`内点分割平面
          • 3.`Ransac`外点分割平面
      • 四、相关数据

一、算法原理

1、Ransac介绍
RANSAC(RAndom SAmple Consensus,随机采样一致)算法是从一组含有“外点”(outliers)的数据中正确估计数学模型参数的迭代算法。“外点”一般指的是数据中的噪声,比如说匹配中的误匹配和估计曲线中的离群点。所以,RANSAC也是一种“外点”检测算法。RANSAC算法是一种不确定算法,它只能在一种概率下产生结果,并且这个概率会随着迭代次数的增加而加大(之后会解释为什么这个算法是这样的)。

RANSAC主要解决样本中的外点问题,最多可处理50%的外点情况。

在这里插入图片描述
范例

可以简单总结为以下步骤:
N:样本个数 K:求解模型需要的最少的点的个数(对于直线拟合来说就是两个点,对于计算Homography矩阵就是四个点)

随机采样K个点
对该K个点拟合模型
计算其他点到拟合模型的距离。如果小于一定阈值,该点被当作内点,统计内点个数
重复M次,选择内点数最多的模型
利用所有的内点重新估计模型(可选)

RANSAC用于拟合直线:
1.随机选取K = 2 ,2个点:
在这里插入图片描述
2.拟合一条直线:
在这里插入图片描述
3.统计内点个数,内点为绿色,此时的内点个数为9(小于一定阈值计算为内点):
在这里插入图片描述
4.重复上述过程M次,找到内点数最大的模型(继续随机选点根据k=数目进行选点):
在这里插入图片描述
5.利用所有的内点重新估计直线:
在这里插入图片描述

二、代码

from pclpy import pcldef compareCloudShow(cloud1, cloud2):"""Args:在一个窗口生成2个窗口可视化点云cloud1: 点云数据1cloud2: 点云数据2"""viewer = pcl.visualization.PCLVisualizer("viewer")  # 建立可刷窗口对象 窗口名 viewerv0 = 1  # 设置标签名(0, 1标记第一个窗口)viewer.createViewPort(0.0, 0.0, 0.5, 1.0, v0)  # 创建一个可视化的窗口viewer.setBackgroundColor(0.0, 0.0, 0.0, v0)  # 设置窗口背景为黑色single_color = pcl.visualization.PointCloudColorHandlerCustom.PointXYZ(cloud1, 255.0, 0, 0.0)  # 将点云设置为红色viewer.addPointCloud(cloud1,          # 要添加到窗口的点云数据。single_color,    # 指定点云的颜色"sample cloud1",  # 添加的点云命名v0)  # 点云添加到的视图v1 = 2  # 设置标签名(2代表第二个窗口)viewer.createViewPort(0.5, 0.0, 1.0, 1.0, v1)  # 创建一个可视化的窗口viewer.setBackgroundColor(255.0, 255.0, 255.0, v1)  # 设置窗口背景为白色single_color = pcl.visualization.PointCloudColorHandlerCustom.PointXYZ(cloud2, 0.0, 255.0, 0.0)  # 将点云设置为绿色viewer.addPointCloud(cloud2,  # 要添加到窗口的点云数据。single_color,  # 指定点云的颜色"sample cloud2",  # 添加的点云命名v1)  # 点云添加到的视图# 设置点云窗口(可移除对点云可视化没有影响)viewer.setPointCloudRenderingProperties(0,  # 设置点云点的大小1,  # 点云像素"sample cloud1",  # 识别特定点云v0)  # 在那个窗口可视化viewer.setPointCloudRenderingProperties(0,  # 设置点云点的大小1,  # 点云像素"sample cloud2",  # 识别特定点云v1)  # 在那个窗口可视化viewer.addCoordinateSystem(1.0)  # 设置坐标轴 坐标轴的长度为1.0# 窗口建立while not viewer.wasStopped():viewer.spinOnce(10)if __name__ == '__main__':# 读取点云数据cloud = pcl.PointCloud.PointXYZ()reader = pcl.io.PCDReader()reader.read('res/table_scene_lms400.pcd', cloud)print('点云数目:', cloud.size())# 创建sor滤波器 参考 pclpy SOR去除异常值(统计滤波) pclpy专栏中cloud_filtered = pcl.PointCloud.PointXYZ()sor = pcl.filters.StatisticalOutlierRemoval.PointXYZ()  # 创建sor处理对象sor.setInputCloud(cloud)  # 将cloud处理sor.setMeanK(50)  # 每个点要分析的邻居数sor.setStddevMulThresh(1.0)  # 距离查询点的平均距离大于1个标准差的点都将被标记为离群值并删除sor.filter(cloud_filtered)  # sor处理后的点云保存在这里(内点)# 可视化滤波效果compareCloudShow(cloud, cloud_filtered)  # 参考 pclpy 可视化点云(多窗口可视化、单窗口多点云可视化) pclpy在专栏中coeffs = pcl.ModelCoefficients()  # 存储估计的平面参数inliers = pcl.PointIndices()  # 存储平面模型的内点索引# 创建分割objectseg = pcl.segmentation.SACSegmentation.PointXYZ()# 可选项seg.setOptimizeCoefficients(True)# 设置seg.setModelType(0)  # 0平面模型seg.setMethodType(0)  # 表示 RANSAC 算法  open3d 平面分割(Ransac算法) 专栏open3dseg.setMaxIterations(1000)  # 设置 RANSAC 算法的最大迭代次数为 1000。seg.setDistanceThreshold(0.01)  # 设置平面模型的距离阈值为 0.01,用于判断点是否为内点(inliers)# 创建滤波objectextract = pcl.filters.ExtractIndices.PointXYZ()nr_points = cloud_filtered.size()  # 获得点云数目while cloud_filtered.size() > nr_points * 0.3:# 从保留的点云中分割最大的平面成分seg.setInputCloud(cloud_filtered)  # 将滤波后的点云数据设置为分割器的输入seg.segment(inliers, coeffs)  # 分割后的内点索引保存在 inliers 中,将平面模型系数保存在 coeffsif len(inliers.indices) == 0:print('无法对给定数据集估计平面模型。')break# 提取内点(平面成分)extract.setInputCloud(cloud_filtered)  # 从点云中提取指定索引的点 和 open3d 中的select_index_by()一样extract.setIndices(inliers)  # 将计算索引进行装填extract.setNegative(False)  # 获得内点cloud_p = pcl.PointCloud.PointXYZ()extract.filter(cloud_p)# 可视化提取出来的平面compareCloudShow(cloud_filtered, cloud_p)print("点云数目:", cloud_p.size())# 再次滤波,提取外点(非平面成分)extract.setNegative(True)   # 获得外点cloud_f = pcl.PointCloud.PointXYZ()  extract.filter(cloud_f)cloud_filtered.swap(cloud_f)  # 等价于cloud_filtered = cloud_f

三、结果

1.sor统计滤波

在这里插入图片描述

2.Ransac内点分割平面

在这里插入图片描述

3.Ransac外点分割平面

在这里插入图片描述

四、相关数据

pclpy SOR去除异常值(统计滤波):pclpy SOR去除异常值(统计滤波)-CSDN博客

pclpy 可视化点云(多窗口可视化、单窗口多点云可视化):pclpy 可视化点云(多窗口可视化、单窗口多点云可视化)-CSDN博客

open3d 平面分割(Ransac算法) open3d 平面分割(Ransac算法)-CSDN博客
在这里插入图片描述

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

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

相关文章

docker运行onlyoffice,并配置https访问【参考仅用】

官方说明: Installing ONLYOFFICE Docs for Docker on a local server - ONLYOFFICEhttps://helpcenter.onlyoffice.com/installation/docs-developer-install-docker.aspx 一、容器端口、目录卷映射 sudo docker run --name容器名称 --restartalways -i -t -d -p…

论文精读--GPT1

把transformer的解码器拿出来,在没有标号的大量文本数据上训练一个语言模型,来获得预训练模型,然后到子任务上微调,得到每个任务所需的分类器 Abstract Natural language understanding comprises a wide range of diverse tasks…

高通XBL阶段读取分区

【需求】: 在某些场景下,需要在XBL阶段读取分区数据,需要验证xbl阶段方案 这里主要以裸分区为例,比如oem分区。 1、创建一个1MB大小的oem.img,写入内容“test oem partition” 创建方式: dd if/dev/null …

独立版表情包小程序完整版源码前后端源码,附带系统搭建教程

搭建要求: 1.系统要求Nginx 1.18.0PHP-7.2mysql5.6,开启 ssl,php需要安装 sg11 扩展 2.设置伪静态 location / { index index.php index.html index.htm; if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?s$1; } } location /a…

计算机体系架构初步入门

🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:高性能(HPC)开发基础教程 🎀CSDN主页 发狂的小花 🌄人生秘诀:学习的本质就是极致重复! 目录 1 计算机五大…

11、内网安全-横向移动NTLM-Relay重放Responder中继攻击LdapEws

用途:个人学习笔记,有所借鉴,欢迎指正! 目录 前提知识: 一、横向移动-NTLM 中继攻击-Relay 重放-SMB 上线 1、CS权限转给MSF: 2、MSF: 3、添加路由: 4、smb_relay重发模块: 5、受控主机输…

神经网络系列---归一化

文章目录 归一化批量归一化预测阶段 测试阶段γ和β(注意)举例 层归一化前向传播反向传播 归一化 批量归一化 (Batch Normalization)在训练过程中的数学公式可以概括如下: 给定一个小批量数据 B { x 1 , x 2 , … …

力扣日记2.22-【回溯算法篇】47. 全排列 II

力扣日记:【回溯算法篇】47. 全排列 II 日期:2023.2.22 参考:代码随想录、力扣 47. 全排列 II 题目描述 难度:中等 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 示例 1: 输…

PX4FMU和PX4IO最底层启动过程分析(下)

PX4FMU和PX4IO最底层启动过程分析(下) PX4FMU的系统启动函数为nash_main(int argc,char *argv[]) PX4IO的系统启动函数为nash_start(int argc,char *argv[]) PX4FMU启动函数nash_main(int argc,char *argv[]) 首先分析一下nash_main(int argc,char *a…

成功解决ModuleNotFoundError: No module named ‘tensorboard‘

成功解决ModuleNotFoundError: No module named ‘tensorboard’ 📅2024年02月25日 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础…

人工智能绘画的时代下到底是谁在主导,是人类的想象力,还是AI的创造力?

#ai作画 目录 一.AI绘画的概念 1. 数据集准备: 2. 模型训练: 3. 生成绘画: 二.AI绘画的应用领域 三.AI绘画的发展 四.AI绘画背后的技术剖析 1.AI绘画的底层原理 2.主流模型的发展趋势 2.1VAE — 伊始之门 2.2GAN 2.2.1GAN相较于…

unity学习(38)——创建(create)角色脚本(panel)--EventSystem

1.在scripts文件夹下创建一个脚本CreatePlayerPanel.cs,脚本挂到panel上!给panel加个tag,叫createPanel,脚本内容如下: using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngin…

unity Aaimation Rigging使用多个约束导致部分约束失去作用

在应用多个约束时,在Hierarchy的顺序可能会影响最终的效果。例如先应用了Aim Constraint,然后再应用Two Bone Constraint,可能会导致Two Bone Constraint受到Aim Constraint的影响而失效。因此,在使用多个约束时,应该仔…

SpringBoot线上打包

背景: 1.我们打包时其实需要很多资源打到jar包之外,这样子修改了配置后,就可以生效了。 2.包的命名: 以mj为例子: 业务层: com.jn.mj // 这个是这个工程的总包名 com.jn.mj.gateway // web服集群 c…

[rust] 10 project, crate, mod, pub, use: 项目目录层级组织, 概念和实战

文章目录 一 项目目录层级组织概念1.1 cargo new 创建同名 的 Project 和 crate1.2 多 crate 的 package1.3 mod 模块1.3.1 创建嵌套 mod1.3.2 mod 树1.3.3 用路径引用 mod1.3.3.1 使用绝对还是相对? 1.3.4 代码可见性1.3.4.1 pub 关键字1.3.4.2 用 super 引用 mod1.3.4.3 用 …

如何使用idea连接服务器上的mysql?

安全组进行开放 具体步骤 关闭防火墙 开放端口号 重启防火墙 firewall-cmd --reload在mysql进行修改配置 update user set host % where user root;flush privileges;使得其他网络也可以连接这个数据库 另外如果想要sqlyog或者其他图形化界面要连接到数据库可以看下面这…

抽象工厂模式 Abstract Factory

1.模式定义: 提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类 2. 应用场景: 程序需要处理不同系列的相关产品,但是您不希望它依赖于这些产品的 具体类时, 可以使用抽象工厂 3.优点: 1.可以确信你从工厂得到的产品彼…

博途PLC PID仿真(单容水箱液位高度控制含变积分变增益测试)

单容水箱和双荣水箱的微分方程和数值求解,可以参考下面文章链接: https://rxxw-control.blog.csdn.net/article/details/131139432https://rxxw-control.blog.csdn.net/article/details/131139432这篇博客我们利用欧拉求解器在PLC里完成单容水箱的数学建模。PLC也可以和MATL…

Linux之JAVA环境配置Tomcat离线安装与启动

一,安装jdk和Tomcat 1.1上传JDK跟Tomcat 1.2解压 解压tomcat tar -zxvf apache-tomcat-8.5.20.tar.gz 解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 1.3.配置环境变量 vim /etc/profile 在最后加上: #java environment export JAVA_HOME/usr/local/ja…

基于Docker和Springboot两种方式安装与部署Camunda流程引擎

文章目录 前言1、Docker安装1.1、拉取Camunda BPM镜像1.2、编写docker启动camunda容器脚本1.3、docker启动脚本1.4、访问验证 2、SpringBoot启动2.1、下载地址2.2、创建SpringBoot项目并配置基础信息2.3、下载SpringBoot项目并在idea中打开2.4、pom修改2.5、application.yml配置…