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

这篇具有很好参考价值的文章主要介绍了Ubuntu 20.04.06 PCL C++学习记录(十八)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

学习背景

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

学习内容

PCL中实现欧式聚类提取。在点云处理中,聚类是一种常见的任务,它将点云数据划分为多个独立的簇或集群。每个簇代表点云中的一个独立物体或区域。聚类可以帮助我们从复杂的点云场景中识别出单独的物体,为后续的物体识别、分类和其他处理任务奠定基础。

源代码及所用函数

源代码

#include<pcl/ModelCoefficients.h>//定义名为 pcl::ModelCoefficients 的类,用于存储模型的系数
#include<pcl/point_types.h>
#include<pcl/io/pcd_io.h>
#include<pcl/filters/extract_indices.h>
#include<pcl/filters/voxel_grid.h>
#include<pcl/kdtree/kdtree.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) 方法进行点云分割的类和函数
#include<pcl/segmentation/extract_clusters.h>//包含 PCL (Point Cloud Library) 中用于点云聚类的头文件

/******************************************************************************
 打开点云数据,并对点云进行滤波重采样预处理,然后采用平面分割模型对点云进行分割处理
 提取出点云中所有在平面上的点集,并将其存盘
******************************************************************************/
int main(int argc,char** argv)
{
    /*********************************************************读取点云数据***************************/
    pcl::PCDReader reader;
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    reader.read("/home/jojo/PointCloud/table_400.pcd",*cloud);
    std::cout << "滤波之前有" << cloud->points.size() << "个点" << std::endl;
    /*************************************创建过滤对象:使用 1 厘米大小的叶片对数据集进行下采样************/
    //使用体素化网格方法实现下采样,即减少点的数量 减少点云数据,并同时保存点云的形状特征   
    pcl::VoxelGrid<pcl::PointXYZ> vg;
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_f(new pcl::PointCloud<pcl::PointXYZ>);
    vg.setInputCloud(cloud);//设置需要过滤的点云给滤波对象
    vg.setLeafSize(0.01f,0.01f,0.01f);//设置滤波时创建的体素体积为1cm的立方体
    vg.filter(*cloud_filtered); //执行滤波处理,存储输出
    std::cout << "滤波之后有" << cloud_filtered->points.size() << "个点" << std::endl;
    /****************************创建平面模型分割的对象并设置参数************************************/
    pcl::SACSegmentation<pcl::PointXYZ> seg;
    pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
    pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_plane(new pcl::PointCloud<pcl::PointXYZ>());
    pcl::PCDWriter writer;
    seg.setOptimizeCoefficients(true);
    seg.setModelType(pcl::SACMODEL_PLANE);//分割模型
    seg.setMethodType(pcl::SAC_RANSAC);//随机参数估计方法
    seg.setMaxIterations(100);//最大的迭代次数
    seg.setDistanceThreshold(0.02);//设置阈值

    int i = 0,nr_points = (int)cloud_filtered->points.size();
    while (cloud_filtered->points.size() > 0.3 * nr_points)
    {
        /**********************************从剩余云中分离出最大的平面***************************/
        seg.setInputCloud(cloud_filtered);
        seg.segment(*inliers,*coefficients);
        if(inliers->indices.size() == 0)
        {
            std::cout << "找不到平面对象" << std::endl;
            break;
        }
        pcl::ExtractIndices<pcl::PointXYZ> extract;
        extract.setInputCloud(cloud_filtered);
        extract.setIndices(inliers);
        extract.setNegative(false);
        /********************************获取与平面相关的点**********************************/
        extract.filter(*cloud_plane);
        std::cout << "代表平面组件的点云有:" << cloud_plane->points.size() << "个" << std::endl;
        /******************************移去平面局内点,提取剩余点云****************************/
        extract.setNegative(true);
        extract.filter(*cloud_f);
        *cloud_filtered = *cloud_f;
    }
    /******************************创建KD树对象****************************************/
    pcl::search::KdTree<pcl::PointXYZ>::Ptr kdtree(new pcl::search::KdTree<pcl::PointXYZ>);
    kdtree->setInputCloud(cloud_filtered);

    std::vector<pcl::PointIndices> cluster_indices;
    pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec;//欧式聚类对象
    ec.setClusterTolerance(0.02);// 设置近邻搜索的搜索半径为2cm
    ec.setMinClusterSize(100);//设置一个聚类需要的最少的点数目为100
    ec.setMaxClusterSize(25000);//设置一个聚类需要的最大点数目为25000
    ec.setSearchMethod(kdtree);//设置点云的搜索机制
    ec.setInputCloud(cloud_filtered);
    ec.extract(cluster_indices);//从点云中提取聚类,并将点云索引保存在cluster_indices中
    //迭代访问点云索引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 << "代表集群的点云:" << cloud_cluster->points.size() << "个" << std::endl;
        std::stringstream ss;
        ss << "cloud_cluster_" << j << ".pcd";
        writer.write<pcl::PointXYZ>(ss.str(),*cloud_cluster,false);
        j++;
        
    }
    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 (cluster_extraction cluster_extraction.cpp)
target_link_libraries (cluster_extraction ${PCL_LIBRARIES})#将PCL库链接到可执行文件目标。

运行结果

Ubuntu 20.04.06 PCL C++学习记录(十八),ubuntu,c++,学习
Ubuntu 20.04.06 PCL C++学习记录(十八),ubuntu,c++,学习
Ubuntu 20.04.06 PCL C++学习记录(十八),ubuntu,c++,学习
Ubuntu 20.04.06 PCL C++学习记录(十八),ubuntu,c++,学习
Ubuntu 20.04.06 PCL C++学习记录(十八),ubuntu,c++,学习
Ubuntu 20.04.06 PCL C++学习记录(十八),ubuntu,c++,学习文章来源地址https://www.toymoban.com/news/detail-852851.html

函数

  • pcl/segmentation/extract_clusters.h包含 PCL (Point Cloud Library) 中用于点云聚类的头文件

补充内容

到了这里,关于Ubuntu 20.04.06 PCL C++学习记录(十八)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决PCL和OpenCV中flann库冲突的问题(Ubuntu20.04+VSCode)

    做视觉处理,尤其是三维视觉和点云处理等,基本都离不开这俩大库,以前要么单独用OpenCV做二维,要么纯用PCL做点云后处理。因为准备把学习期间的代码整合起来,所以需要同时使用两个库,结果发现 flann库冲突 的问题🤪 查阅了一下网上的方案,基本有几种方案 1.建议改

    2024年02月15日
    浏览(61)
  • 【PCL】ubuntu20.04安装 VTK7.1与PCL1.8(PCL依赖VTK,要先装且最好源码安装)

    Ref: 源码安装 (apt安装的方式会出现.so文件缺失的情况!!!)) ubuntu16.04 安装Qt5 + VTK7.1.1 + PCL1.8.0 第二部分 Ubuntu20.04安装VTK 下载 下载地址 依赖安装 VTK安装 方法一出现的错误: make过程中出现的 错误: Could not find  a package configuration file provided by \\\"Qt5X11Extras\\\" with any of the followi

    2024年02月03日
    浏览(46)
  • ubuntu20.04 直接安装vpp23.06 测试双 VPP Tunnel Ike2

    环境信息:VMware® Workstation 17 Pro + ubuntu20.04 (清华源) ubuntu 源点进去选:ubuntu-22.04.3-desktop-amd64.iso   如果之前装过VPP,用以下命令确定是否卸载干净: 卸载: 下载链接: fdio/release - Results for ubuntu/focal in fdio/release 下载选项:focal(ubuntu20.04)  选中要下载的包双击进入  找到wg

    2024年02月11日
    浏览(41)
  • Ubuntu20.04安装Unity踩坑记录

    链接:https://docs.unity3d.com/hub/manual/InstallHub.html?_ga=2.264734605.30268629.1678763370-652752773.1678763370#install-hub-linux step1 一切顺利 结果: step2 开始报错了!! E: 仓库 “https://ppa.launchpadcontent.net/jonathonf/ffmpeg-4/ubuntu jammy Release” 没有 Release 文件。 解决办法: 参考教程:apt-get update时提示仓

    2024年02月04日
    浏览(43)
  • 【记录】ubuntu20.04安装nvidia显卡驱动

    新安装的Ubuntu20.04系统,如果想进行人工智能相关的学习,需要配置一系列的环境,这里我记录下具体的安装过程。 Nvidia显卡驱动的安装 1 安装前需要安装依赖(必须执行) 2 查看自己的GPU型号,这个如果自己知道,其实没必要,如果不确定,可以用下面的命令进行查看 3 Nvid

    2024年02月13日
    浏览(56)
  • 【记录】Ubuntu20.04如何使用中文输入法

    安装完Ubuntu系统,发现中文输入法不能用,这里记录下使用中文输入法的过程。 1 打开 setting 2 页面左侧的导航栏中选择“RegionLanguage”,然后在右侧页面中点击“Manage Install Languages”。 如果弹出下面这个窗口,单击 Install,然后等待安装完毕。 单击“Install/Remove Languages”。

    2024年02月16日
    浏览(47)
  • 记录Ubuntu20.04系统安装后立刻安装无线网驱动

    ubuntu安装无线网卡驱动 查看电脑对应版本的网卡型号 查找驱动及对应内核版本 安装驱动 我的电脑显卡为RTX 3070Ti。在安装好Ubuntu20.04系统后,因为是镜像安装,遇到过两种情况: 安装的系统内核为5.13.0(不自带无线网卡驱动),Settings没有WIFI。 安装的系统内核为5.15.0(自带

    2024年02月16日
    浏览(65)
  • 【Linux】Ubuntu20.04 无法访问 http://cn.archive.ubuntu.com 问题记录解决

    您希望继续执行吗? [Y/n] Y 错误:1 http://cn.archive.ubuntu.com/ubuntu focal/universe amd64 binfmt-support amd64 2.2.0-2 无法发起与 cn.archive.ubuntu.com:80 (2001:67c:1562::18) 的连接 - connect (101: 网络不可达) 无法发起与 cn.archive.ubuntu.com:80 (2001:67c:1562::15) 的连接 - connect (101: 网络不可达) 无法连接上 cn.ar

    2024年02月06日
    浏览(55)
  • Ubuntu-base(20.04/22.04) armhf / aarch64移植记录

    根文件系统官网 进入如下图选择版本-进入release 版本下载界面-下载armhf/arm64文件。 在/home/zynq/linux/rootfs/下建立mount.sh 在/home/zynq/linux/rootfs/下建立unmount.sh 给两个文件赋权限 运行mount.sh 挂载文件系统 adduser 和useradd的区别: adduser 和useradd的区别:

    2024年02月11日
    浏览(66)
  • django-vue-admin ubuntu 20.04 环境准备 记录

    django-vue-admin 运行记录 https://django-vue-admin.com/document/hjbs.html https://django-vue-admin.com/document/hjbs.html https://bbs.django-vue-admin.com/article/9.html https://gitee.com/liqianglog/django-vue-admin/tree/demo_project 1. 安装 ubuntu-20.04.6 桌面版 ubuntu-20.04.6-desktop-amd64.iso 桌面版本 桌面版的目的是 有浏览器可以看

    2024年02月11日
    浏览(84)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包