[点云分割] 欧式距离分割

news2025/2/24 11:40:15

效果:

 

代码:

#include <iostream>
#include <chrono>

#include <pcl/ModelCoefficients.h> // 模型系数的定义
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h> // 各种点云数据类型
#include <pcl/sample_consensus/method_types.h> // 包含用于采样一致性算法的不同方法的定义,如RANSAC、MSAC等
#include <pcl/sample_consensus/model_types.h> // 包含用于采样一致性算法的不同模型的定义,如平面、球体、圆柱体
#include <pcl/segmentation/sac_segmentation.h> // 包含用于分割点云的采样一致性算法(SACSegmentation)的定义,用于识别点云的几何模型
#include <pcl/filters/extract_indices.h> // 包含用于从点云中提取特定索引的函数和类,用于根据索引提取点云中的子集
#include <pcl/visualization/pcl_visualizer.h> // 包含了用于可视化点云的函数和类,用于在3D视窗中现实点云数据

#include <pcl/features/normal_3d.h> // 估计法线
#include <pcl/filters/passthrough.h> // 直通滤波
#include <pcl/filters/voxel_grid.h> // 体素化
#include <pcl/segmentation/extract_clusters.h>
#include <iomanip>

typedef pcl::PointXYZ PointT;

int main(){

    pcl::PCDReader reader;
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>), cloud_f (new pcl::PointCloud<pcl::PointXYZ>);
    reader.read("/home/lrj/work/pointCloudData/table_scene_lms400.pcd", *cloud);
    std::cout << "PointCloud before filtering has: " << cloud->size() << " data points.\n";


    pcl::VoxelGrid<pcl::PointXYZ> vg;
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>());
    vg.setInputCloud(cloud);
    vg.setLeafSize(0.01f, 0.01f, 0.01f);
    vg.filter(*cloud_filtered);
    std::cout << "PointCloud after filtering has: " << cloud_filtered->size() << " data points." << 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 nr_points = (int) cloud_filtered->size();
    while (cloud_filtered->size() > 0.3 * nr_points)
    {
        seg.setInputCloud(cloud_filtered);
        seg.segment(*inliers, *coefficients);
        if (inliers->indices.size() == 0)
        {
            std::cout << "Cloud not estimate a planar model for the given dataset.\n";
            break;
        }


        pcl::ExtractIndices<pcl::PointXYZ> extract;
        extract.setInputCloud(cloud_filtered);
        extract.setIndices(inliers);

        extract.setNegative(false);
        extract.filter(*cloud_plane);

        extract.setNegative(true);
        extract.filter(*cloud_f);
        *cloud_filtered = *cloud_f;
    }

    pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
    tree->setInputCloud(cloud_filtered);

    std::vector<pcl::PointIndices> cluster_indices;
    pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec;
    ec.setClusterTolerance(0.02); // 2cm
    ec.setMinClusterSize(100);
    ec.setMaxClusterSize(25000);
    ec.setSearchMethod(tree);
    ec.setInputCloud(cloud_filtered);
    ec.extract(cluster_indices);

    int j=0;
    for (const auto& cluster: cluster_indices)
    {
        pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_cluster (new pcl::PointCloud<pcl::PointXYZ>);
        for (const auto& idx : cluster.indices){
            cloud_cluster->push_back((*cloud_filtered)[idx]);
        }

        cloud_cluster->width = cloud_cluster->size();
        cloud_cluster->height = 1;
        cloud_cluster->is_dense = true;

        std::cout << "PointCloud representing the Cluster: " << cloud_cluster->size() << "data points.\n";
        std::stringstream ss;
        ss << std::setw(4) << std::setfill('0') << j;
        writer.write<pcl::PointXYZ> ("cloud_cluster_" + ss.str() + ".pcd", *cloud_cluster,false);
        j++;
    }

    return(0);

}

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

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

相关文章

云南旅游攻略思维导图

马上就要2024年春节了&#xff0c;相信小伙伴们都蠢蠢欲动了&#xff0c;春节去哪里玩&#xff1f;今天小P来给大家分享云南旅游攻略了&#xff0c;希望可以对大家有所帮助。 为什么要来云南呢&#xff1f;因为云南的绝大多数地方&#xff0c;一年四季总是那样温暖&#xff1b;…

redis的主从复制,哨兵模式

1.主从复制 主从复制&#xff1a;主从复制是redis实现高可用的基础&#xff0c;哨兵模式和集群都是在主从复制的基础之上实现高可用 主从复制实现数据的多机备份&#xff0c;以及读写分离&#xff08;主服务器负责写&#xff0c;从服务器只能读&#xff09; 缺陷&#xff1a…

java springboot测试类鉴定虚拟MVC运行值与预期值是否相同

好 上文java springboot在测试类中构建虚拟MVC环境并发送请求中 我们模拟的MVC环境 发送了一个请求 我们这次需要 对比 预期值和运行值是否一直 这里 我们要用一个 MockMvcResultMatchers 他提供了非常多的校验类型 例如 请求有没有成功 有没有包含请求头信息 等等 这里 我们做…

前端性能优化总结

这里写目录标题 页面性能测试工具测试指标 前端页面性能常见的问题前端页面性能优化常见策略及方案dns优化------预解析域名&#xff08;异步进行&#xff09;http请求优化减少请求次数同时多开持久连接 前面面试url从输入到确认搜索发生了什么js介绍new一个对象的过程&#xf…

智能配电房环境监控系统

智能配电房环境监控系统是一种用于实时监测和控制配电房环境的系统。依托电易云-智慧电力物联网&#xff0c;通过集成应用物联网技术&#xff0c;实现对配电房内环境的全天候状态监视和智能控制。以下是智能配电房环境监控系统的主要功能&#xff1a; 环境数据实时监测&#xf…

Autoware.universe部署06:使用DBC文件进行UDP的CAN通信代码编写

目录标题 一、安装DBC文件编辑工具VectorCANdb二、编写DBC文件2.1 CAN通信协议2.2 编写DBC文件2.2.1 根据CAN协议设置signals2.2.2 设置报文2.2.3 建立节点 三、根据DBC文件编写ROS2驱动程序四、实际通信调试 根据CAN协议编写DBC文件&#xff0c;通过DBC文件编写ROS2包进行UDP通…

Centos7使用rpm安装mysql 5.7.43

Centos7使用rpm安装mysql 5.7.43 1、下载rpm包 wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.43-1.el7.x86_64.rpm-bundle.tar2、解压并安装 tar xf mysql-5.7.43-1.el7.x86_64.rpm-bundle.tar yum -y install mysql-*3、按需修改mysql配置 #注意&a…

【OpenCV实现图像:使用OpenCV进行物体轮廓排序】

文章目录 概要读取图像获取轮廓轮廓排序小结 概要 在图像处理中&#xff0c;经常需要进行与物体轮廓相关的操作&#xff0c;比如计算目标轮廓的周长、面积等。为了获取目标轮廓的信息&#xff0c;通常使用OpenCV的findContours函数。然而&#xff0c;一旦获得轮廓信息后&#…

WCS WMS WES关系

一、定义&#xff1a; 仓库控制系统 &#xff08;WCS&#xff09; 是一种软件应用程序。 WCS用于指导仓库和配送中心&#xff08;DC&#xff09; 内的实时活动。作为仓库/配送中心的“交通警察”&#xff0c;WCS 负责保持一切顺利运行&#xff0c;最大限度地提高物料搬运子系…

Android修行手册-溢出父布局的按钮实现点击

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

《算法通关村——幂运算问题解析》

《算法通关村——幂运算问题解析》 2 的幂 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数 x 使得 n 2x &#xff0c;则认为 n 是 2 的幂次方。 示例 1&#xff1…

纽扣电池上架TEMU、亚马逊美国站需要做什么认证?纽扣电池认证标准16CFR1700.15,16CFR1700.20

近日&#xff0c;Temu连发多条卖家弹窗内容均为商品质量事故违规处理通告。其中一条为卖家销售的车载吸尘器发生烧毁、冒烟等情况&#xff0c;产生用户人伤、财损等舆情。经查实是商家偷换关键部件锂电池&#xff0c;导致商品质量下降造成事故。TEMU对于问题车载吸尘器处理结果…

MATLAB实现灰色预测

久违了&#xff0c;前段时间由于学习压力大&#xff0c;就没怎么更新MATLAB相关的内容&#xff0c;今天实在学不进去了&#xff0c;换个内容更新一下~ 本贴介绍灰色预测模型&#xff0c;这也是数学建模竞赛常见算法中的一员&#xff0c;和许多预测模型一样——底层原理是根据已…

win10 eclipse安装教程

前言&#xff1a;安装eclipse之前必须安装JDK&#xff0c;JDK是编译环境&#xff0c;eclipse是集成开发平台。 一、JDK的安装 Java Development Kit 简称 JDK (一). 官方下载地址&#xff1a; Java Archive Downloads - Java SE 8u211 and later (oracle.com) 找到&#xf…

【每日一题】2304. 网格中的最小路径代价-2023.11.22

题目&#xff1a; 2304. 网格中的最小路径代价 给你一个下标从 0 开始的整数矩阵 grid &#xff0c;矩阵大小为 m x n &#xff0c;由从 0 到 m * n - 1 的不同整数组成。你可以在此矩阵中&#xff0c;从一个单元格移动到 下一行 的任何其他单元格。如果你位于单元格 (x, y) …

分享-Spss下载含spss25.spss26.spss27等版本

为了学习spss买的&#xff0c;分享安装程序给大家 SPSS 27是一款用于统计分析和数据挖掘的软件&#xff0c;以下是SPSS 27的功能介绍和配置建议&#xff1a; 功能介绍&#xff1a; 数据管理&#xff1a;SPSS 27可以对数据进行管理和清洗&#xff0c;包括数据输入、缺失值处理…

MATLAB - text的两种使用方法

text小技巧 1. 常规使用&#xff08;Method 1&#xff09;2. 在显示画面的相对位置&#xff08;Method 2&#xff09;3. 举个例子 1. 常规使用&#xff08;Method 1&#xff09; text(x,y,txt)2. 在显示画面的相对位置&#xff08;Method 2&#xff09; text(string,‘ABC’,…

【蓝桥杯选拔赛真题25】C++两个数比大小 第十三届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析

目录 C/C++两个数比大小 一、题目要求 1、编程实现 2、输入输出 二、算法分析

谷歌开发者账号登录提示“存在异常活动”的原因及解决方法

相信很多开发者在登录谷歌开发者账号时遇到过这样的情况&#xff1a;“Verify your identity” “Weve detected unusual activity on the accountyoure trying to access. To continue, please followthe instructions below.” “验证您的身份&#xff0c;我们已经检测到你…