【PCL-11】提取平面上层的目标物,剔除平面下层目标物

因项目需求,需提取平面上的物体,不提取平面下的物体,尝试采用超体聚类+LCCP分割的方式,但由于上层点云模型一侧有空洞,导致分割效果不理想。

这里采用pcl::ExtractPolygonalPrismData类,实现平面上物体的提取。
pcl::ExtractPolygonalPrismData类是通过设定处于同一平面模型上的点索引向量,并指定一定高度,利用指定的点形成二维凸包,再结合指定高度生成多边形棱柱模型,分割出该棱柱的内部点集。
1、生成凸包

pcl::ConvexHull<pcl::PointXYZ> hull;
hull.setInputCloud(plane);
//重构的维度,若设置为2,则表示计算平面上的凸包
hull.setDimension(2);
//执行凸包重构,将结果存储在convexHull指向的点云中
hull.reconstruct(*convexHull);

2、构建棱柱模型及分割

// 该类用于分割出棱柱模型内部的点集
pcl::ExtractPolygonalPrismData<pcl::PointXYZ> prism;
prism.setInputCloud(cloud);
// 设置平面模型的点集
prism.setInputPlanarHull(convexHull);
// 设置高度范围
prism.setHeightLimits(35.0f, 500.0f);
pcl::PointIndices::Ptr objectIndices(new pcl::PointIndices);
prism.segment(*objectIndices);
// 分割目标物
extract.setIndices(objectIndices);
extract.filter(*objects);

完整示例代码:

#include <pcl/io/pcd_io.h>
#include <pcl/sample_consensus/method_types.h>
#include <pcl/sample_consensus/model_types.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/surface/convex_hull.h>
#include <pcl/segmentation/extract_polygonal_prism_data.h>
#include <pcl/visualization/cloud_viewer.h>#include <iostream>int
main(int argc, char** argv)
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr plane(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr convexHull(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr objects(new pcl::PointCloud<pcl::PointXYZ>);if (pcl::io::loadPCDFile<pcl::PointXYZ>("..\\testdata\\result\\cylinder.pcd", *cloud) != 0){return -1;}pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);// 采样一致性算法实现的分割类pcl::SACSegmentation<pcl::PointXYZ> segmentation;segmentation.setInputCloud(cloud);// 设置构造的几何模型类型segmentation.setModelType(pcl::SACMODEL_PLANE);// 设置采样一致性方法类型segmentation.setMethodType(pcl::SAC_RANSAC);// 设置点到模型的距离阈值segmentation.setDistanceThreshold(10);// 设置模型参数优化segmentation.setOptimizeCoefficients(true);pcl::PointIndices::Ptr planeIndices(new pcl::PointIndices);segmentation.segment(*planeIndices, *coefficients);if (planeIndices->indices.size() == 0)std::cout << "Could not find a plane in the scene." << std::endl;else{// Copy the points of the plane to a new cloud.pcl::ExtractIndices<pcl::PointXYZ> extract;extract.setInputCloud(cloud);extract.setIndices(planeIndices);extract.filter(*plane);// 保存平面点云pcl::io::savePCDFile("..\\testdata\\result\\data\\plane.pcd", *plane);// 生成凸包pcl::ConvexHull<pcl::PointXYZ> hull;hull.setInputCloud(plane);//重构的维度,若设置为2,则表示计算平面上的凸包hull.setDimension(2);hull.reconstruct(*convexHull);//pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> color_handler(cloud, 255, 188, 255);//pcl::visualization::PCLVisualizer viewer("Cloud Viewer");viewer.addPointCloud<pcl::PointXYZ>(cloud, "原始点云");//viewer.addPointCloud<pcl::PointXYZ>(convexHull, color_handler, "凸包点云");//viewer.spin();// 冗余检查.检查凸包的维度是否为2if (hull.getDimension() == 2){// 该类用于分割出棱柱模型内部的点集pcl::ExtractPolygonalPrismData<pcl::PointXYZ> prism;prism.setInputCloud(cloud);// 设置平面模型的点集prism.setInputPlanarHull(convexHull);// 设置高度范围prism.setHeightLimits(35.0f, 500.0f);pcl::PointIndices::Ptr objectIndices(new pcl::PointIndices);prism.segment(*objectIndices);// Get and show all points retrieved by the hull.extract.setIndices(objectIndices);extract.filter(*objects);//可视化pcl::visualization::CloudViewer viewerObjects("Objects on table");viewerObjects.showCloud(objects);pcl::io::savePCDFile("..\\testdata\\result\\data\\objects.pcd", *objects);while (!viewerObjects.wasStopped()){// Do nothing but wait.}}else std::cout << "The chosen hull is not planar." << std::endl;}return 0;
}

运行效果:

构建三维凸包,分割效果不理想,更换二维凸包后,效果较好。

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

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

相关文章

免费:CAD批量转PDF工具,附下载地址

分享一款CAD 批量转PDF、打印的工具插件。能自动识别图框大小、自动识别比例、自动编号命名。重点&#xff01;重点&#xff01;重点&#xff01;自动将CAD的多张图纸一次性地、批量地转为PDF&#xff0c;或者打印。效果看下图&#xff1a; 适用环境&#xff1a; 32位系统 Auto…

亚马逊评分规则是什么,如何提高亚马逊等级评分-站斧浏览器

亚马逊平台的账户评级问题&#xff0c;如果账号评级比较差的话&#xff0c;那么会有一些不好的影响&#xff0c;因此卖家朋友们需要想办法去提升自己的账户评级。那么亚马逊评分规则是什么&#xff0c;如何提高亚马逊等级评分。 亚马逊评分规则是什么&#xff1f; 所有新卖家…

机器学习——boosting之提升树

提升树和adaboost基本流程是相似的 我看到提升树的时候&#xff0c;懵了 这…跟adaboost有啥区别&#xff1f;&#xff1f;&#xff1f; 直到看到有个up主说了&#xff0c;我才稍微懂 相当于&#xff0c;我在adaboost里的弱分类器&#xff0c;换成CART决策树就好了呗&#xff1…

《安富莱嵌入式周报》第322期:自制10KV电子负载,史上最详细的电池系列资料,创意洞洞板任意互联,开源USB分析仪,英特尔雷电5, QNX功能安全免费课程

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版&#xff1a; https://www.bilibili.com/video/BV1M8411q7dw/ 《安富莱嵌入式周报》第322期&#xff1a;自制10K…

机器学习基础算法--回归类型和评价分析

目录 1.数据归一化处理 2.数据标准化处理 3.Lasso回归模型 4.岭回归模型 5.评价指标计算 1.数据归一化处理 """ x的归一化的方法还是比较多的我们就选取最为基本的归一化方法 x(x-x_min)/(x_max-x_min) """ import numpy as np from sklea…

SVN 和 GIT 命令对比

参考 https://blog.csdn.net/justry_deng/article/details/82259470 # TortoiseSVN打分支、合并分支、切换分支 https://www.huliujia.com/blog/802a64152bbbe877c95c84ef2fdf3857a056b536/ # 版本控制&#xff1a;Git与Svn的命令对应关系 TortoiseSVN打分支、合并分支、切换…

关系型数据库和非关系型数据库

关系型数据库是以关系&#xff08;表格&#xff09;为基础的数据库&#xff0c;它采用了 SQL&#xff08;Structured Query Language&#xff09;作为数据操作语言&#xff0c;常见的关系型数据库包括 MySQL、Oracle、SQL Server 等。 非关系型数据库则是基于文档、键值、列族…

分布式多级缓存

例子&#xff08;测试环境&#xff09; 项目结构图 运行反向代理服务器也就是负责反向代理到三个nginx的nginx&#xff0c;该nignx也负责前端页面的跳转。 该nginx的conf为下: 突出位置就是该nginx需要反向代理的其他nginx的IP和端口。 Lua语法 linux安装Lua #安装lua环境 …

ES-OAS-ERP-电子政务-企业信息化

ES-OAS-ERP-电子政务-企业信息化 专家系统ES办公自动化系统OAS企业资源规划ERP典型的信息系统架构模型 专家系统ES 模拟人类专家&#xff0c;解决结构化&#xff0c;半结构化问题 数据级&#xff0c;知识库级&#xff0c;控制级 专家系统的特点就是和人的区别 启发性知识&#…

upload-labs文件上传漏洞通关

一、环境搭建 upload-labs是一个使用php语言编写的&#xff0c;专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。 下载地址&#xff1a;https://github.com/c0ny1/upload-labs/releases 在 win 环境下 直接解压到phpstudy下即可 二、通关 &#xff08;一&#xff09;16关…

伦敦金投资为什么要止损?

目前&#xff0c;伦敦金投资的知识越来越丰富&#xff0c;更多普通的投资者都能学习到很多的专业的伦敦金投资知识。其中&#xff0c;伦敦金投资中的止损问题在交易时经常被提及。一些投资者认为我们在伦敦进市场中&#xff0c;投资只管勇往直前就行了&#xff0c;为什么还要考…

系统架构设计专业技能 · 软件工程之UML建模设计

现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. 点击进入系列文章目录 系统架构设计高级技能 软件工程之UML建模设计 一、需求分析 - UML图二、用例图2.…