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

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

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

学习背景

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

学习内容

源代码及所用函数

源代码

#include<iostream>
#include<vector>
#include<pcl/point_types.h>
#include<pcl/io/pcd_io.h>
#include<pcl/search/search.h>
#include<pcl/search/kdtree.h>
#include<pcl/features/normal_3d.h>
#include<pcl/visualization/cloud_viewer.h>
#include<pcl/filters/filter_indices.h>
#include<pcl/segmentation/region_growing.h>

int main(int argc,char** argv)
{
    /*********************************读取点云文件**************************************************/
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    if (pcl::io::loadPCDFile("/home/jojo/PointCloud/table_400.pcd",*cloud) == -1)
    {
        std::cout << "没有找到文件" << std::endl;
        return -1;
    }
    /*****************************************计算表面法线****************************************/
    pcl::search::Search<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
    pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
    pcl::NormalEstimation<pcl::PointXYZ,pcl::Normal> normal_estimator;
    normal_estimator.setSearchMethod(tree);
    normal_estimator.setInputCloud(cloud);
    normal_estimator.setKSearch(50);
    normal_estimator.compute(*normals);
    /******************************************从点云数据中移除 NaN 值*****************************/
    pcl::IndicesPtr indices(new std::vector<int>);
    pcl::removeNaNFromPointCloud(*cloud,*indices);
    /*******************************************设置区域生长算法**********************************/
    pcl::RegionGrowing<pcl::PointXYZ,pcl::Normal> reg;
    reg.setMinClusterSize(50);//设置最小簇的大小。
    reg.setMaxClusterSize(1000000);//设置最大簇的大小。
    reg.setSearchMethod(tree);//设置搜索方法    
    reg.setNumberOfNeighbours(30);//设置邻域点的数量。
    reg.setInputCloud(cloud);//设置输入点云。
    reg.setIndices(indices);//设置点云索引,指定要处理的点云子集
    reg.setInputNormals (normals);//设置输入点云的法向量
    reg.setSmoothnessThreshold(3.0/180.0*M_PI);//设置平滑度阈值,3.0 表示角度阈值为3度
    reg.setCurvatureThreshold(1.0);//设置曲率阈值

    std::vector<pcl::PointIndices> clusters;
    reg.extract(clusters);

    std::cout << "群集数等于" << clusters.size() << std::endl;
    std::cout << "第一个集群有 " << clusters[0].indices.size () << " 个点." << std::endl;
    std::cout << "这些是初始这些是初始点的指数" <<std::endl << "属于第一个群组的云:" <<std::endl;
    std::size_t counter = 0;
    while (counter < clusters[0].indices.size())
    {
        std::cout << clusters[0].indices[counter] << ", ";
        counter++;
        if (counter%10==0)
        {
            std::cout << std::endl;
        }
    }
    std::cout << std::endl;
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr colored_cloud = reg.getColoredCloud();
    pcl::visualization::CloudViewer viewer("Cluster Viewer");
    viewer.showCloud(colored_cloud);
    while(!viewer.wasStopped())
    {

    }
    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 (region_growing_segmentation region_growing_segmentation.cpp)
target_link_libraries (region_growing_segmentation ${PCL_LIBRARIES})#将PCL库链接到可执行文件目标。


运行结果

Ubuntu 20.04.06 PCL C++学习记录(十九),ubuntu,c++,学习

函数

  • pcl::RegionGrowing 是 PCL 库中提供的一种区域生长分割算法,它根据点云的几何特征(如法向量、曲率等)将点云分割成不同的区域。

      pcl::PointXYZ:指定输入点云的类型为 pcl::PointXYZ,表示每个点包含 XYZ 坐标信息。
      pcl::Normal:指定点云的法向量类型为 pcl::Normal,表示每个点的法向量信息。
      
      setInputCloud:设置输入点云。
      setInputNormals:设置输入点云的法向量。
      setSearchMethod:设置搜索方法(如 KdTree)。
      setNumberOfNeighbours:设置邻域点的数量。
      setMinClusterSize:设置最小簇的大小。
      setMaxClusterSize:设置最大簇的大小。
      setSmoothnessThreshold:设置平滑度阈值。
      setCurvatureThreshold:设置曲率阈值。
    
  • reg.getColoredCloud()pcl::RegionGrowing 类的一个成员函数,它返回一个彩色点云。在 pcl::RegionGrowing 算法执行后,不同的区域会被赋予不同的伪随机颜色,以区分不同的簇或分割区域。

补充内容

  • pcl::search::Searchpcl::PointXYZ::Ptrpcl::search::KdTreepcl::PointXYZ::Ptr 区别

    1. pcl::search::Search<pcl::PointXYZ>::Ptr 是一个抽象基类指针,它定义了一组用于搜索点云数据的通用接口。这个基类本身不提供任何具体的实现,而是作为一个通用接口,允许其他具体的搜索算法类继承并实现它。
    2. pcl::search::KdTree<pcl::PointXYZ>::Ptr 是一个具体的搜索算法类指针,它实现了基于 K-D 树数据结构的搜索算法。K-D 树是一种用于存储和查找多维数据的树状数据结构,它能够高效地进行最近邻搜索和范围搜索等操作。

    简单来说,pcl::search::Search<pcl::PointXYZ>::Ptr 是一个通用的搜索接口,pcl::search::KdTree<pcl::PointXYZ>::Ptr 则是一种基于 K-D 树的具体搜索算法实现文章来源地址https://www.toymoban.com/news/detail-852843.html

到了这里,关于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日
    浏览(47)
  • 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如何使用中文输入法

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

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

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

    2024年02月13日
    浏览(56)
  • 记录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日
    浏览(85)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包