PCL中点云分割算法简析

news2024/10/7 12:28:21

文章目录

  • 前言
  • 一、点云分割算法简介
    • 1.1 基于RANSAC的点云分割
    • 1.2 基于聚类的点云分割
      • 1.2.1 欧式聚类分割
    • 1.3 基于深度学习的点云分割
  • 二、算法示例
    • 2.1 基于RANSAC的平面分割
    • 2.2 欧式聚类
    • 2.3 基于PointNet++的点云分割
  • 总结


前言

点云分割算法广泛应用于激光遥感、无人驾驶、工业自动化领域,其原理是根据空间、几何和纹理等特征对点云进行划分,使同一划分内的点云拥有类似的特征。

一、点云分割算法简介

点云分割算法经过长时间的发展,目前大致可以分为基于随机采样一致的分割算法、基于聚类的分割算法和基于点云深度学习模型的算法。

1.1 基于RANSAC的点云分割

RANSAC算法是一种非常经典的点云拟合算法,同时可以根据拟合结果实现点云分割,常用于规则点云的分割,例如直线、平面、圆球等。
其基本原理前面写过,是通过把点云随机一个初始模型,把所有点分为内点和外点,并设定阈值,符合阈值的为内点,不符合的为外点,不断迭代,最终满足迭代条件从而实现点云分割的。

1.2 基于聚类的点云分割

聚类是机器学习中非常重要的概念,属于无监督学习任务。
目前聚类的方法有很多,但算法基本原理都是类似的,即不需要标签,仅依靠数据的特征把数据分为不同的类或者簇,使类内的元素的相似性尽可能的大,类间元素相似性则尽可能小。
二维图像聚类个人比较熟悉K-均值和高斯混合聚类。
点云聚类分割最简单的则是欧式聚类分割,除了该算法,还有基于区域生长、图割法、超体素分割等方法。

1.2.1 欧式聚类分割

欧式聚类分割和K-均值聚类算法的思路很相似:
1:首先设定初始点p,用Kd-tree进行半径为r的点云搜索,得到初始点集合Q。
2:在Q中选择新的种子点,进行步骤1,若Q不再新增加点,且聚类总点数在设定的点云数量范围内,则Q聚类完成,否则重新开始1。
3:在剩余点云中继续选点执行上述步骤。

1.3 基于深度学习的点云分割

目前基于深度学习的点云分割模型的工作已有很多,流行的包括PointNet、PointNet++、RandLA-Net、PointConv、PCT和PointCNN等,一篇综述介绍的比较好。
基于深度学习的三维点云分割综述
目前该领域的研究主要应用于无人驾驶领域。

二、算法示例

2.1 基于RANSAC的平面分割

pcl::PointCloud<pcl::PointXYZ> cloud;
	//填充点云数据
	cloud.width = 1000;
	cloud.height = 1;
	cloud.points.resize(cloud.width * cloud.height);
	for (size_t i = 0; i < cloud.points.size(); ++i)
	{
		cloud.points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
		cloud.points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
		cloud.points[i].z = 1.0;
	}
	//设置局外点
	cloud.points[23].z = 20;
	cloud.points[203].z = -120.0;
	cloud.points[106].z = -60;
	cloud.points[400].z = 5;
	cloud.points[921].z = 3;
	cloud.points[8].z = 120.0;
	cloud.points[103].z = -220.0;
	cloud.points[206].z = -310;
	cloud.points[300].z = 602;
	cloud.points[821].z = 405;

	pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
	pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
	//创建分割对象
	pcl::SACSegmentation<pcl::PointXYZ> seg;
	seg.setOptimizeCoefficients(true);
	//设置参数
	seg.setModelType(pcl::SACMODEL_PLANE);
	seg.setMethodType(pcl::SAC_RANSAC);
	seg.setDistanceThreshold(0.01);
	seg.setInputCloud(cloud.makeShared());
	seg.segment(*inliers, *coefficients);
	if (inliers->indices.size() == 0)
	{
		PCL_ERROR("Could not estimate a planar model for the given dataset.");
	}
	//输出平面模型的系数
	std::cout << "Model coefficients: " << coefficients->values[0] << " "
		<< coefficients->values[1] << " "
		<< coefficients->values[2] << " "
		<< coefficients->values[3] << std::endl;
	std::cout << "Model inliers: " << inliers->indices.size() << std::endl;

在这里插入图片描述

2.2 欧式聚类

    pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
	tree->setInputCloud(cloud_filtered);//设置输入点云

	std::vector<pcl::PointIndices> cluster_indices;
	pcl::EuclideanClusterExtraction<pcl::PointXYZ> ecluster;//创建一个聚类对象
	ecluster.setClusterTolerance(0.02); //设置近邻搜索的搜索半径为2cm
	ecluster.setMinClusterSize(100);    //设置一个聚类需要的最少点数目为100
	ecluster.setMaxClusterSize(2000);  //设置一个聚类需要的最大点数目为2000
	ecluster.setSearchMethod(tree);     //设置点云的搜索机制
	ecluster.setInputCloud(cloud_filtered); //设置原始点云 
	ecluster.extract(cluster_indices);  //从点云中提取聚类

    int j = 0;
	for (std::vector<pcl::PointIndices>::const_iterator it = cluster_indices.begin(); it != cluster_indices.end(); ++it)
	{
		pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_cluster(new pcl::PointCloud<pcl::PointXYZ>);
		for (std::vector<int>::const_iterator pit = it->indices.begin(); pit != it->indices.end(); pit++)
			cloud_cluster->points.push_back(cloud_filtered->points[*pit]); //*

		cloud_cluster->width = cloud_cluster->points.size();
		cloud_cluster->height = 1;
		cloud_cluster->is_dense = true;

		std::cout << "当前聚类 " << j << " 包含的点云数量: " << cloud_cluster->points.size() << " data points." << std::endl;
		std::stringstream ss;
		ss << "cloud_cluster_" << j << ".pcd";
		writer.write<pcl::PointXYZ>(ss.str(), *cloud_cluster, false); //*
		j++;
		viewer->addPointCloud(cloud_cluster, cluster_color, ss.str(), v2);
	}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 基于PointNet++的点云分割

待续。。

总结

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

centos安装nginx教程

安装所需环境 Nginx 是 C语言 开发&#xff0c;建议在 Linux 上运行&#xff0c;当然&#xff0c;也可以安装 Windows 版本&#xff0c;本篇则使用 CentOS 7 作为安装环境。 一. gcc 安装 安装 nginx 需要先将官网下载的源码进行编译&#xff0c;编译依赖 gcc 环境&#xff0c…

【ESD专题】案例:TVS管钳位电压能不能通过TLP测试数据表征?

这几天遇到一个问题,就是还是想说TVS管导入的时候需要进行IEC61000-4-2 8kV接触静电的钳位波形测试。 比如有时可以看到规格书中给出对应的在IEC61000-4-2 8kV接触时的真实钳位波形: 根据我们文章【ESD专题】TVS管的选择的误区及钳位电压测试方法和一些参考手册所说…

计算机操作系统第四版第七章文件管理—课后习题答案

1.何谓数据项、记录和文件&#xff1f; 数据项&#xff1a;是最低级的数据组织形式&#xff0c;可以分为两种类型&#xff1a;基本数据项和组合数据项。基本数据项是用于描述一个对象的某种属性的字符集&#xff0c;是数据组织中可以命名的最小逻辑数据单位&#xff0c;又称为字…

使用volta对node版本进行控制

安装volta 首先下载volta 下载完成之后在电脑上使用命令行工具查看是否安装成功 volta -v 使用 volta -h 命令可以查看volta的一些用法 安装全局的node版本,可以有三种,第一种是安装最新的,第二种是安装某一个大版本下的,第三种是安装指定的node版本(安装的时候需要等待一段时…

Rest风格复习

Rest风格复习 简介三种注解的风格快速开发 简介 通过一段路径和访问方式来确定访问资源的行为方式 使用POST方式 // value定义 路径 method定义访问的方式RequestMapping(value "/users",method RequestMethod.POST)ResponseBodypublic String save(){System.out.…

Andrew Ng和OpenAI教你写prompt

课程地址&#xff1a; https://learn.deeplearning.ai/chatgpt-prompt-engb站搬运&#xff1a; https://www.bilibili.com/video/BV1No4y1t7Zn 教学人员&#xff1a;Lsa Fulford&#xff0c; Andrew NG LLM的两种样式 Base LLM:基于文本训练数据预测下一个词的概率&#xff0…

制作Alpine Linux镜像报错errors: 15 distinct packages available

1.执行报错 执行docker build -t 镜像:版本 -f Dockerfile . 报错&#xff1a; 2.查看网上的解决思路 网上文档解决思路&#xff1a; 这边我做了一下改变把这些写入了dockerfile 加了几个RUN RUN rm -rf /var/cache/apk RUN mkdir -p /var/cache/apk RUN apk update -v 发现还…

Java基本数据类型详解及应用示例

Java作为一门强类型语言&#xff0c;基本数据类型是非常重要的概念。Java中基本数据类型分为四种类别&#xff1a;整数类型、浮点数类型、字符类型和布尔类型。其中&#xff0c;每一种数据类型都有着不同的占用字节数和表示范围&#xff0c;合理使用选择不同的数据类型可以提高…

数组低效的“插入”和“删除”

插入操作 假设数组的长度为 n&#xff0c;现在&#xff0c;如果我们需要将一个数据插入到数组中的第 k 个位置。为了把第 k 个位置腾出来&#xff0c;给新来的数据&#xff0c;我们需要将第 k&#xff5e;n 这部分的元素都顺序地往后挪一位。那插入操作的时间复杂度是多少呢&a…

ChatGPT 中文指令指南,教会你如何使用chatgpt实现中文你想要的答案

&#x1f9e0; ChatGPT 中文指令指南&#xff0c;教会你如何使用chatgpt实现中文你想要的答案 1.学习英语–替代词典 App 场景例子Prompts解释中文英文意思&#xff0c;并解释单词的词根词缀。可以替代词典。告诉我 Egocentric 的词性和音标&#xff0c;并使用中文和英文解释…

OpenAI开源语音识别模型Whisper在Windows系统的安装详细过程

1、安装Python Python的安装很简单&#xff0c;点击这里进行下载。 安装完成之后&#xff0c;输入python -V可以看到版本信息&#xff0c;说明已经安装成功了。 如果输入python -V命令没有看到上面的这样的信息&#xff0c;要么是安装失败&#xff0c;要么是安装好之后没有自…

【自然语言处理】【大模型】CodeGen:一个用于多轮程序合成的代码大语言模型

CodeGen&#xff1a;一个用于多轮程序合成的代码大语言模型 《Code Gen: An Open Large Language Model For Code with Multi-Turn Program Synthesis》 论文地址&#xff1a;https://arxiv.org/pdf/2203.13474.pdf?trkpublic_post_comment-text 相关博客 【自然语言处理】【大…

【EasyPoi实战系列】Spring Boot使用EasyPoi实现一对多的导出 - 第469篇

​ 历史文章&#xff08;文章累计460&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》…

Exams/2012 q1g

module top_module (input [4:1] x,output f ); assign f ~x[2]&~x[4] | ~x[1]&x[3] | x[2] & x[3] & x[4]; endmodule

4-Tr0ll-1百个靶机渗透(精写-思路为主)

文章目录 目录 文章目录 前言 一、信息收集 二、提权 1.提权方法1 2.提权方法2 3.提权方法3 4.提权方法4 5.root免密登录的方法 总结 前言 思路清晰&#xff1a; 1.信息收集&#xff0c;寻找内网靶机&#xff0c;得到可以利用的ftp、ssh和web站点的常规端口。 2.因为这个靶机…

Visual Studio 2019离线安装包获取和安装教程

摘要 介绍Visual Studio 2019离线安装方法和配置及注意事项 关键词 VS2019 离线安装 Visual Studio 2019版本与以往的2015、2013、2012版本不同&#xff0c;采用了新的模块化安装方法。微软官方也并未提供ISO镜像&#xff0c;根据官方提供的离线下载方案&#xff08;docs.mic…

「AI 孙燕姿」翻唱华语乐坛歌曲爆红全网,AI 翻唱将带来哪些影响?是否会有版权等问题?

在某视频平台上&#xff0c;“AI孙燕姿”成了新网红&#xff0c;它翻唱过周杰伦的《发如雪》、翻唱过郭顶的《水星记》、翻唱过赵雷的《我记得》&#xff0c;受到了网友的追捧&#xff0c;甚至有网友宣布“这是2023年最火的声音”。 网上除了AI孙燕姿&#xff0c;还有AI周杰伦…

AOP、spring事务管理

目录 AOP简介 AOP入门案例 AOP配置管理 AOP通知类型 业务层接口执行效率 AOP通知获取数据 百度网盘密码数据兼容处理 AOP事务管理 AOP简介 什么是AOP? AOP(Aspect Oriented Programming)面向切面编程&#xff0c;一种编程范式&#xff0c;指导开发者如何组织程序结…

HTML <area> 标签

实例 带有可点击区域的图像映射: <img src="planets.jpg" border="0" usemap="#planetmap" alt="Planets" /><map name="planetmap" id="planetmap"><area shape="circle" coords=&q…

AHUT周赛2

1.A - Mahmoud and Ehab and the MEX Problem - A - Codeforces 核心在于x之前的数肯定是有的&#xff0c;x是没有的 所以从0开始一直到x&#xff0c;如果哪个数没有就加上哪个数(操作数1)&#xff0c;如果有x就删去x(操作数1) AC代码&#xff1a; #include<iostream>…