提取点云-------PCL

提取点云

/// <summary>
/// VoxelGrid滤波下采样
/// </summary>
/// <param name="cloud">需要滤波的点云</param>
/// <param name="lx">三维体素栅格的x</param>
/// <param name="ly">三维体素栅格的y</param>
/// <param name="lz">三维体素栅格的z</param>
/// <returns></returns>
pcl::PCLPointCloud2::Ptr PclTool::voxelGridFilter(pcl::PCLPointCloud2::Ptr cloud, float lx, float ly, float lz)
{
    pcl::PCLPointCloud2::Ptr cloud_filtered(new pcl::PCLPointCloud2());

    pcl::VoxelGrid<pcl::PCLPointCloud2> sor;  // 创建滤波对象
    sor.setInputCloud(cloud);                 // 设置需要过滤的点云给滤波对象
    sor.setLeafSize(lx, ly, lz);              // 设置滤波时创建的体素体积 单位:m
    sor.filter(*cloud_filtered);              // 执行滤波处理,存储输出

    return cloud_filtered;

}

pcl::PCLPointCloud2::Ptr PclTool::voxelGridFilter(pcl::PCLPointCloud2::Ptr cloud, float lx, float ly, float lz)
{
    pcl::PCLPointCloud2::Ptr cloud_filtered(new pcl::PCLPointCloud2());

    pcl::VoxelGrid<pcl::PCLPointCloud2> sor;  // 创建滤波对象
    sor.setInputCloud(cloud);                 // 设置需要过滤的点云给滤波对象
    sor.setLeafSize(lx, ly, lz);              // 设置滤波时创建的体素体积 单位:m
    sor.filter(*cloud_filtered);              // 执行滤波处理,存储输出

    return cloud_filtered;

}
// 点云提取
std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> PclTool::cloudExtraction(pcl::PCLPointCloud2::Ptr cloud)
{
    std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> vecCloud;
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_f(new pcl::PointCloud<pcl::PointXYZ>);

      std::cout << "PointCloud before filtering: " << cloud->width * cloud->height << " data points." << std::endl;

    // 先对点云做VoxelGrid滤波器对数据进行下采样,在这里进行下才样是为了加速处理过程
    pcl::PCLPointCloud2::Ptr cloud_filtered_blob = voxelGridFilter(cloud, 0.1, 0.1, 0.1);

    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
    // 转换为模板点云
    pcl::fromPCLPointCloud2(*cloud_filtered_blob, *cloud_filtered);

    std::cout << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height << " data points." << std::endl;

    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.setMaxIterations(1000);               // 设置最大迭代次数
    seg.setDistanceThreshold(0.01);           // 判断是否为模型内点的距离阀值

      // 设置ExtractIndices的实际参数
    pcl::ExtractIndices<pcl::PointXYZ> extract;  // 创建点云提取对象
    int i = 0;
    int nr_points = (int)cloud_filtered->points.size();  // 点云总数
    for (int i = 0; cloud_filtered->points.size() > 0.3 * nr_points; i++)
    {
        // 为了处理点云包含的多个模型,在一个循环中执行该过程并在每次模型被提取后,保存剩余的点进行迭代
        seg.setInputCloud(cloud_filtered);
        seg.segment(*inliers, *coefficients);
        if (inliers->indices.size() == 0)
        {
            // 无法估计给定数据集的平面模型。
            std::cout << "Could not estimate a planar model for the given dataset." << std::endl;
            break;
        }
        //提取入口
        pcl::PointCloud<pcl::PointXYZ>::Ptr temp_cloud(new pcl::PointCloud<pcl::PointXYZ>);
        extract.setInputCloud(cloud_filtered);
        extract.setIndices(inliers);
        extract.setNegative(false);
        extract.filter(*temp_cloud);
        vecCloud.push_back(temp_cloud);
        std::cout << "Extract the " << i << "point cloud : " << temp_cloud->width * temp_cloud->height << " data points." << std::endl;

        //创建筛选对象
        extract.setNegative(true);
        extract.filter(*cloud_f);
        cloud_filtered.swap(cloud_f);
    }

    return vecCloud;
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue 下载文件 处理后台返回的文件流

1. 下载文件很常见&#xff0c;下载成各种格式的也很常见&#xff0c;本质就是后台返回一个文件流&#xff0c;我们前端去处理一下就行&#xff0c;但是如果因为某些条件&#xff0c;没有返回文件流&#xff0c;返回告诉你&#xff0c;文件出现错误了&#xff0c;那我们就需要把…

【机器学习】分类与预测算法的评价与优化

以实际案例解析F1值与P-R曲线的应用 一、分类算法与性能评价的重要性二、F1值与P-R曲线的概念与意义三、实例解析&#xff1a;以垃圾邮件检测为例四、代码实现与结果分析五、结论与展望 在数据驱动的时代&#xff0c;机器学习算法以其强大的数据处理和分析能力&#xff0c;成为…

deepinV23 Beta3 安装Nvidia显卡驱动

文章目录 下载驱动禁用系统自带的nouveau驱动查看系统是否启用了nouveau显卡驱动禁用nouveau 安装重启后报错其他问题安装其他版本的驱动[nvidia-smi 显示 CUDA Version:N/A](https://blog.csdn.net/JiuYux/article/details/137981588) 注意&#xff1a;先看 重启后报错 章节 …

基于TCC的分布式事务

优质博文&#xff1a;IT-BLOG-CN 一、分布式事务简介 分布式的架构中&#xff0c;分布式的事务是一个绕不过的挑战&#xff0c;微服务理念的流行让分布式的问题日益突出。 在公司内部&#xff0c; 笔者所接触的管理系统中实际上也存在着分布式事务。 这里假设有这三个系统&…

Scanpy(2)多种可视化

本篇内容为scanpy的可视化方法&#xff0c;可以分为三部分&#xff1a; embedding的散点图&#xff1b;用已知marker genes的聚类识别&#xff08;Identification of clusters&#xff09;&#xff1b;可视化基因的差异表达&#xff1b; 我们使用10x的PBMC数据集&#xff08;…

全新Linux教程-驱动大全-PCI和PCIe子系统-P5-PCIe设备的配置过程

1 PCIe系统硬件结构 注意&#xff1a;在pci设备中&#xff0c;可以通过引脚选中设备&#xff0c;但是在PCIe设备中&#xff0c;由于是端对端的配置过程&#xff08;endpoint to endpoint&#xff09;。PCIe桥中有很多端口&#xff0c;端口可以直接连接PCIe设备。在设备之间只有…

python连接数据库1

1、建立简单的数据库连接&#xff08;前提是有数据库&#xff09; from pymysql import Connection connConnection(host localhost, #主机名 /ip地址 127.0.0.1port3306, #端口&#xff0c;默认为这个userroot, #账户名password123456 #密码&#xff0c;自己的密码 ) #打印相…

施耐德 M340 PWM1 功能块使用方法

功能块帮助文档&#xff1a;《EcoStruxure™ Control Expert - 控制 , 功能块库》https://www.schneider-electric.cn/zh/download/document/33003687K01000/输出处理 --> PWM1&#xff1a;脉宽调制 功能块样式、引脚 EN BOOL 输入。1使能功能块&#xff0c;0不使能功能块…

14.基础乐理-音级、基本音级、变化音级

音级&#xff1a; 乐音体系中的每一个音&#xff0c;都叫 音级。 基本音级&#xff1a; 基本音级是 CDEFGAB 它们七个&#xff0c;在钢琴上使用白键展示的&#xff0c;没有任何升降号、没有任何重升重降号的。 变化音级&#xff1a; 除了 CDEFGAB 这七个音&#xff0c;都叫变化…

利用Python进行大规模数据处理

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 利用Python进行大规模数据处理&#xff1a;Hadoop与Spark的对比 随着数据量的不断增长&…

web网站搭建实验

综合练习&#xff1a;请给openlab搭建web网站 网站需求&#xff1a; 1.基于域名www.openlab.com可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料 和缴费网站&#xff0c;基于&#xff0c;www.openlab.com/data网站…

Android RecyclerView的LayoutManager配置

RecyclerView的item布局方式依赖于其配置的布局管理器。不同的布局管理器可以实现不同的界面效果。 LayoutManager介绍 RecyclerView可以通过setLayoutManager设置布局管理器&#xff0c;该方法的源码如下&#xff1a; /*** Set the {link LayoutManager} that this RecyclerV…

JAVA 项目<果园之窗>_1

这几天有空看能不能把水果店管理系统整出来&#xff0c;目标是整个网页版本的&#xff0c;以我的电脑做服务器&#xff0c;数据存在mysql中 以我目前的理解整个项目大致可分为前端部分、后端部分、数据库部分&#xff0c;也就这三个部分 目前打开并运行了一个别人的项目&#…

Linux下SPI设备驱动实验:验证读写SPI设备中数据的函数功能

一. 简介 前面文章实现了 SPI设备驱动框架&#xff0c;并在此基础上添加了字符设备驱动框架&#xff0c;实现了读 / 写SPI设备中数据的函数&#xff0c;文章如下&#xff1a; Linux下SPI设备驱动实验&#xff1a;向SPI驱动框架中加入字符设备驱动框架代码-CSDN博客 Linux下…

2024年学浪的缓存怎么导出来

在自我成长的道路上&#xff0c;越来越多的朋友选择通过精选课程来提升自己。然而&#xff0c;面对那些服务期限有限的课程&#xff0c;怎样才能把握住知识的光芒&#xff0c;让它照亮未来的每一个角落&#xff1f;本文就教大家如何利用工具下载学浪app平台的课程 工具我已经打…

【ARM 裸机】I.MX 启动方式之启动头文件 2

接上一节&#xff1a;【ARM 裸机】I.MX 启动方式之启动头文件 1&#xff1b; 2.3、DCD DCD&#xff0c;Device Configuration Data &#xff0c;就是配置 6ULL 寄存器的&#xff0c;DCD 数据最大限制 1768 字节&#xff1b; CCGR0 是不是很熟悉&#xff1f;对&#xff0c;在…

C++奇迹之旅:深入理解赋值运算符重载

文章目录 &#x1f4dd;赋值运算符重载&#x1f320; 运算符重载&#x1f309;特性 &#x1f320; 赋值运算符重载&#x1f320;传值返回&#xff1a;&#x1f320;传引用赋值&#xff1a;&#x1f309;两种返回选择&#x1f309;赋值运算符只能重载成类的成员函数不能重载成全…

用Gold-yolo模块改进yolov8模型

gold-yolo论文&#xff1a; https://arxiv.org/pdf/2309.11331.pdf gold-yolo代码&#xff1a; https://github.com/huawei-noah/Efficient-Computing/tree/master/Detection/Gold-YOLO 一 gold模块简介 Gold-Yolo是华为诺亚方舟实验室2023年发布的工作&#xff0c;主要优化检…

Linux程序的地址空间,进程终止

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 一.程序的地址空间 1.1程序的地址空间的引入 我们知道frok可以创建…

重塑我们对随机性在计算中的作用的理解

2023年图灵奖&#xff0c;最近刚刚颁给普林斯顿数学教授 Avi Wigderson&#xff01;作为理论计算机科学领域的领军人物&#xff0c;他对于理解计算中的随机性和伪随机性的作用&#xff0c;作出了开创性贡献。 Avi Wigderson 的履历 自 1999 年以来&#xff0c;Wigderson 一直担…
最新文章