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.mzph.cn/news/800771.shtml

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

相关文章

IP地址到底有什么用

IP地址在计算机网络中的作用至关重要&#xff0c;它不仅是设备在网络中的唯一标识&#xff0c;更是实现网络通信、网络管理和安全的关键要素。下面&#xff0c;我们将从多个方面详细阐述IP地址的作用。 首先&#xff0c;IP地址作为设备的唯一标识&#xff0c;为网络通信提供了…

JavaScript - 你做过字符串反转吗

难度级别:初级及以上 提问概率:65% 例如有一个字符串本来是“abcde”,那么现在希望可以将其反转,最终的值是“edcba”,该如何做呢? 第一种是将字符串转为数组,利用数组的reverse方法实现元素反转,然后再将数组转为字符串,代码如下 …

面试必问!鸿蒙开发中的FA模型和Stage模型是什么?他们分别有什么区别?

鸿蒙OS&#xff08;HarmonyOS&#xff09; 是面向全场景的分布式操作系统&#xff0c;它通过创新的应用模型&#xff0c;为开发者提供了强大的应用开发框架。 在HarmonyOS的发展过程中&#xff0c;FA模型&#xff08;Feature Ability&#xff09;和Stage模型是两种重要的应用模…

常规的k8s的监控指标

常规的监控指标 1、集群维度 集群状态集群节点数节点状态(正常、不可达、未知)节点的资源使用率(CPU、内存、IO等)2、应用维度 应用响应时间 应用的错误率 应用的请求量 3、系统和集群组件维度 API服务器状态控制器状态etcd状态常用的 Prometheus Operator 指标 常用监控…

静电场概述

什么是静电场 静电场是由特殊的电荷引起场。 这个特殊的电荷指&#xff1a;相对于观察者静止、且电量不随时间改变的电荷。 库仑定律 指在无限大的真空中&#xff0c;当两个静止的小带电体之间的距离远远大于本身的几何尺寸时&#xff0c;该两带电体之间的作用力。 如图所示…

二分查找 -- 力扣(LeetCode)第704题

题目 https://leetcode.cn/problems/binary-search/description/ 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例…

如何在微信小程序中使用less来编写css

在微信小程序中使用 Less 需要一些额外的配置步骤,因为小程序本身不支持直接引用 Less 文件。我们可以借助 Webpack 进行构建,使用一些 loader 来编译 Less 文件。以下是具体步骤: 初始化项目 使用微信开发者工具新建一个小程序项目,或在已有项目的基础上操作。 安装依赖 使…

JavaScript代码小挑战

题目如下&#xff1a; 朱莉娅和凯特正在做一项关于狗的研究。于是&#xff0c;她们分别询问了 5 位狗主人他们的狗的年龄&#xff0c;并将数据存储到一个数组中&#xff08;每人一个数组&#xff09;。目前&#xff0c;她们只想知道一只狗是成年狗还是小狗。如果狗的年龄至少为…

SpringBoot集成Skywalking链路追踪

安装skywaling 参考&#xff1a;Centos7搭建 SkyWalking 单机版-CSDN博客 下载Agents https://archive.apache.org/dist/skywalking/java-agent/9.0.0/apache-skywalking-java-agent-9.0.0.tgz 1. 在IDEA中使用skywalking agent 在VM options中填入如下信息 -javaagent后是…

Scaling Laws 又失灵了?谷歌新研究:扩散模型不是越大越好

近年来&#xff0c;模型规模呈现出愈来愈大的趋势&#xff0c;越来越多的人相信“力大砖飞”。 OpenAI 虽然没有公布Sora的训练细节&#xff0c;但在Sora的技术报告中提到了&#xff1a; Our largest model, Sora, is capable of generating a minute of high fidelity video.…

[RK-Linux] RK3399启动流程详解

一、SoC启动流程 1.1 BootROM介绍 在嵌入式系统中,SoC(System on Chip)制造商通常会在芯片内部集成一段固化的启动代码,这段代码被称为BootROM,它负责系统的最初级启动程序。 1.1.1 初始化硬件 当SoC上电时,首先由BootROM接管系统,其首要任务是初始化硬件环境。这包…

AI技术创业机会之金融科技

金融科技服务(FinTech)领域正经历着一场由人工智能(AI)技术引领的深刻变革,为创业者提供了无数创新与颠覆传统金融服务模式的机会。以下详述了金融科技服务中AI技术的具体创业机会及其细节与内容,以期为有志于涉足此领域的创业者提供全面的洞察与参考。 一、智能投顾与财…

Dify开源大语言模型(LLM) 应用开发平台如何使用Docker部署与远程访问

文章目录 1. Docker部署Dify2. 本地访问Dify3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 本文主要介绍如何在Linux Ubuntu系统以Docker的方式快速部署Dify,并结合cpolar内网穿透工具实现公网远程访问本地Dify&#xff01; Dify 是一款…

spring01:IOC(控制反转)

spring01&#xff1a;IOC&#xff08;控制反转&#xff09; 文章目录 spring01&#xff1a;IOC&#xff08;控制反转&#xff09;前言&#xff1a;一、IOC&#xff1a;inversion of control&#xff08;控制反转&#xff09;控制&#xff1a;控制对象的创建&#xff01;&#x…

西安交通大学《数据库理论与技术》课程实验+期末考试资料全通关

课程概况 首先请确认一下课程情况&#xff1a;数据库理论与技术是西安交通大学开设的秋季研究生选修课程&#xff0c;授课教师为侯迪老师。 本文涉及的所有资料下载链接&#xff1a;链接: https://pan.baidu.com/s/1oB9I6SSaWejZwmM6NfTFpg 提取码: hrww 本课程有五次当堂小…

如何在Linux中找到正在运行的Java应用的JAR文件

当你在Linux服务器上工作时&#xff0c;可能需要找到某个正在运行的Java应用的JAR文件位置。这对于诊断问题、更新应用或理解部署结构非常有用。以下是一个步骤详细的指南&#xff0c;帮助你找到这些信息。 1. 确定Java进程 首先&#xff0c;你需要确定正在运行的Java应用的进…

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

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

day20-二叉树part07

530.二叉搜索树的最小绝对差 思路&#xff1a;中序遍历转换成有序数组&#xff0c;遍历数组计算数组相邻元素的差值保存最小&#xff0c;多开辟一个数组空间 class Solution {private List<Integer> list new ArrayList<>();private void traversal(TreeNode roo…

【Linux】基础IO----系统文件IO 文件描述符fd 重定向

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解在Linux下的系统文件IO&#xff0c;知道什么是文件描述符&#xff0c;什么是重定向 > 毒鸡汤&#xff1a;白日莫闲过&#xff0c;青春不再来。 …

Js 的事件循环(Event Loop)机制

Js 的事件循环(Event Loop)机制 1、js是单线程的&#xff0c;会有阻塞问题 2、浏览器解决阻塞问题的方法&#xff1a;如网络请求、settimeout是用异步来做的&#xff0c;但异步任务没有优先级。为了更灵活&#xff0c;增加了事件循环 3、事件有同步任务和异步任务&#xff0c;先…