Ubuntu 20.04.06 PCL C++学习记录(十六)

@[TOC]PCL中点云分割模块的学习

学习背景

参考书籍:《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,,PCL版本为1.10.0,CMake版本为3.16

学习内容

用一组点云数据做简单的平面的分割

源代码及所用函数

源代码

#include<iostream>
#include<pcl/ModelCoefficients.h>//定义名为 pcl::ModelCoefficients 的类,用于存储模型的系数
#include<pcl/io/pcd_io.h>
#include<pcl/point_types.h>
#include<pcl/sample_consensus/method_types.h>//随即参数估计方法头文件
#include<pcl/sample_consensus/model_types.h>//定义 PCL 中用于随机采样一致性 (SAC) 方法的枚举类型
#include<pcl/segmentation/sac_segmentation.h>//提供 PCL 中用于基于随机采样一致性 (SAC) 方法进行点云分割的类和函数int main(int argc,char** aegv)
{/********************************生成并设置点云**************************************************************///生成点云pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);cloud->width = 15;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;}//设置几个局外点,即重新设置几个点的z值,使其偏离z为1的平面cloud->points[0].z = 2.0;cloud->points[3].z = -2.0;cloud->points[6].z = 4.0;std::cerr << "Point cloud data: " << cloud->points.size () << " points" << std::endl; for (size_t i = 0; i < cloud->points.size(); i++){std::cout<<" "<<cloud->points[i].x<< " "<<cloud->points[i].y<< " "<<cloud->points[i].z<< std::endl;}/************************************设置分割参数***********************************************///创建分割时所需要的模型系数对象,coefficients及存储内点的点索引集合对象inlierspcl::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);//设置随机采样一致性方法类型,SAC_RANSAC:随机采样一致性 (RANSAC) 方法seg.setDistanceThreshold(0.01);//设定距离阀值,距离阀值决定了点被认为是局内点是必须满足的条件,表示点到估计模型的距离最大值seg.setInputCloud(cloud);//引发分割实现,存储分割结果到点几何inliers及存储平面模型的系数coefficientsseg.segment(*inliers,*coefficients);if (inliers->indices.size()==0){PCL_ERROR("无法为给定数据集估计平面模型");return -1;}//打印出平面模型std::cout << "模型系数" << coefficients->values[0] << " " << coefficients->values[1] << " "<< coefficients->values[2] << " " << coefficients->values[3] << std::endl;std::cout << "离群值模型" << inliers->indices.size() <<std::endl;for (size_t i = 0; i < inliers->indices.size(); i++){std::cerr << inliers->indices[i] << "    " << cloud->points[inliers->indices[i]].x << " "<< cloud->points[inliers->indices[i]].y << " "<< cloud->points[inliers->indices[i]].z << std::endl;}return 0;}

CMakeLists.txt

cmake_minimum_required(VERSION 3.16 FATAL_ERROR)#指定CMake的最低版本要求为3.16
project(project)#设置项目名称
find_package(PCL 1.10 REQUIRED)#查找PCL库,要求版本为1.10或更高。
include_directories(${PCL_INCLUDE_DIRS})#将PCL库的头文件目录添加到包含路径中
link_directories(${PCL_LIBRARY_DIRS})#将PCL库的库文件目录添加到链接器搜索路径中。
add_definitions(${PCL_DEFINITIONS})#添加PCL库的编译器定义
add_executable (planar_segmentation planar_segmentation.cpp)
target_link_libraries (planar_segmentation ${PCL_LIBRARIES})#将PCL库链接到可执行文件目标。

运行结果

在这里插入图片描述

函数

  • #include<pcl/ModelCoefficients.h>定义了一个名为 pcl::ModelCoefficients 的类,用于存储模型的系数。在点云处理中,我们经常需要拟合各种模型,如平面、球体、圆柱体等。这些模型可以用一组系数来表示,例如:

    对于平面模型,我们需要存储平面的法向量和距离系数。
    对于球体模型,我们需要存储球心坐标和半径。
    对于圆柱体模型,我们需要存储圆柱轴的方向向量、圆柱体上一点的坐标以及半径。

    pcl::ModelCoefficients 类提供了一种通用的方式来存储这些模型系数。它内部使用了一个 std::vector 来存储系数值。

  • #include<pcl/sample_consensus/method_types.h> 这个头文件定义了 PCL 中用于随机采样一致性 (SAC) 方法的枚举类型。
    随机采样一致性 (SAC) 是一种在带有异常值的数据集中估计模型参数的方法。PCL 提供了多种 SAC 方法,如 RANSAC、LMEDS、MSAC 和 RRANSAC 等。这些方法在处理含有噪声和异常值的数据时非常有用,特别是在计算机视觉和点云处理领域。

  • #include<pcl/segmentation/sac_segmentation.h>这个头文件提供了 PCL 中用于基于随机采样一致性 (SAC) 方法进行点云分割的类和函数。头文件提供了一个名为 pcl::SACSegmentation 的类,该类实现了基于 SAC 方法的点云分割算法。
    该类提供了以下主要功能:
    设置分割的模型类型:可以使用 setModelType() 函数设置要拟合的模型类型,如平面、圆柱体、球体等。
    设置 SAC 方法的类型:可以使用 setMethodType() 函数设置所使用的 SAC 方法,如 RANSAC、LMEDS 等。
    设置分割参数:可以使用 setDistanceThreshold()、setMaxIterations()、setProbability() 等函数设置分割算法的参数,如距离阈值、最大迭代次数、概率等。
    执行分割:使用 segment() 函数执行点云分割,该函数将点云作为输入,并输出分割结果,包括模型系数和内点索引。

补充内容

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

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

相关文章

IDEA中修改git的作者、邮箱名称

目录 一、查看当前git信息 1、查看git作者名称 如下图&#xff1a; 2、查看git邮箱信息 二、修改git信息 1、修改git作者名称 如下图&#xff1a; 2、修改git邮箱名称 一、查看当前git信息 1、查看git作者名称 在git控制台 或者 Terminal 输入 git config user.name …

如何高效学习Python编程语言

理解Python的应用场景 不同的编程语言有不同的发展历史和应用场景,了解Python主要应用在哪些领域对于学习它会有很大帮助。Python最初是一种通用脚本语言,主要用于系统级任务自动化。随着时间的推移,它逐步成为数据处理、科学计算、Web开发、自动化运维等众多领域的主要编程语…

【多线程】多线程下使用集合类

一.Java中线程安全的集合类 Java中提供了多种线程安全的集合类&#xff0c;它们可以在多线程环境下安全地被多个线程同时访问而无需外部同步。以下是一些常见的线程安全集合类&#xff1a; Vector: 类似于 ArrayList 的动态数组&#xff0c;但是所有方法都是同步的&#xff0…

lottery-攻防世界

题目 flag在这里要用钱买&#xff0c;这是个赌博网站。注册个账号&#xff0c;然后输入七位数字&#xff0c;中奖会得到相应奖励。 githacker获取网站源码 &#xff0c;但是找到了flag文件但是没用。 bp 抓包发现api.php&#xff0c;并且出现我们的输入数字。 根据题目给的附…

跨越网络边界:借助C++编写的下载器程序,轻松获取Amazon商品信息

背景介绍 在数字化时代&#xff0c;数据是新的石油。企业和开发者都在寻找高效的方法来收集和分析网络上的信息。亚马逊&#xff0c;作为全球最大的电子商务平台之一&#xff0c;拥有丰富的商品信息&#xff0c;这对于市场分析和竞争情报来说是一个宝贵的资源。 问题陈述 然…

Vue - 你知道Vue中computed和watch的区别吗

难度级别:中高级及以上 提问概率:70% 二者都是用来监听数据变化的,而且在日常工作中大部分时候都只是局限于简单实用,所以到了面试中很难全面说出二者的区别。接下来我们看一下,二者究竟有哪些区别呢? 先说computed,它的主要用途是监听…

vs2017离线安装(配合QT5.9.2使用)

以vs2017_Professional版本为例&#xff1a; 一、下载安装包vs2017_Professional.exe&#xff08;在线安装包即可&#xff09; 二、创建在目录&#xff1a;C:\vs2017_Professional_Package&#xff0c;把vs2017_Professional.exe放在该目录下。 ID&#xff1a; Microsoft.Vis…

C++设计模式:桥模式(五)

1、定义与动机 桥模式定义&#xff1a;将抽象部分&#xff08;业务功能&#xff09;与实现部分&#xff08;平台实现&#xff09;分离&#xff0c;使他们可以独立地变化引入动机&#xff1a; 由于某些类型的固有的实现逻辑&#xff0c;使得它们具有两个变化的维度&#xff0c;…

QT 使用redis ,连接并使用

一.redis安装 链接&#xff1a;https://pan.baidu.com/s/17fXKOj5M4VIypR0y5_xtHw 提取码&#xff1a;1234 1.下载得到文件夹如图 course_redis为安装包。 2.启动Redis服务 把安装包解压到某个路径下即可。 打开cmd窗口&#xff0c;切换到Redis安装路径&#xff0c;输入 r…

4月21日,Sui成都开发者茶话会诚邀您来

由 Sui Foundation, 开发者教育平台 HackQuest&#xff0c;MoveBit&#xff0c;PoP Planet 共同主办的 Sui 成都开发者茶话会将于 4 月 21 日下午 2:00–6:00 举办&#xff0c;我们诚挚邀请所有对 Sui 生态&#xff0c;Sui Move 语言&#xff0c;和 Web3 开发有兴趣的小伙伴前来…

基于Springboot框架北京某大学失物招领系统设计与实现 研究背景和意义、国内外现状_失物招领发展现状

此外&#xff0c;基于Springboot框架的北京某大学失物招领系统还具有重要的社会意义。该系统可以为广大师生提供更加便捷、高效的失物招领服务&#xff0c;减少因失物而带来的经济损失和精神困扰。同时&#xff0c;该系统还可以促进校园文化的建设和传播&#xff0c;营造和谐、…

【UE 网络】DS框架学习路线

目录 0 引言1 如何学习DS框架1. 熟悉Unreal Engine基础2. 学习网络编程基础3. 掌握UE网络概念4. 实践和实验5. 加入社区和论坛6. 官方示例和案例研究7. 专业书籍和在线课程 2 DS框架重要知识点有哪些1. 网络复制2. 远程过程调用&#xff08;RPC&#xff09;3. 客户端服务器架构…