PCL_BoundaryEstimation边界提取

2023-11-06

pcl::BoundaryEstimation用于散乱点云的边界提取,但应该只适用于简单的点云,过于复杂的话效果应该不太好。同时,需要pcl::NormalEstimation先计算法线,算起来也挺慢的。

https://download.csdn.net/download/qq_32867925/10184934  这个资源里有一个文献可以参考理解

获取采样点的近邻点作为局部型面参考数据,以最小二乘法拟合该数据的微切平面,并将其向微切平面投影,根据采样点与其k近邻所对应投影点连线的最大夹角识别散乱点云边界特征。

文献中算法效果,可以看出有些许的改进。

资源代码结果:


pcl源代码:

#include <iostream>
#include <pcl/console/parse.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>
#include <pcl/features/boundary.h>
#include <math.h>
#include <boost/make_shared.hpp>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/io/pcd_io.h>

#include <pcl/visualization/range_image_visualizer.h>
#include <pcl/features/normal_3d.h>

#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/filters/covariance_sampling.h>
#include <pcl/filters/normal_space.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/features/boundary.h>
#include <pcl/io/ply_io.h>


int estimateBorders(pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud,float re,float reforn) 
{ 

	pcl::PointCloud<pcl::Boundary> boundaries; 
	//使用角度标准确定一组点是否位于边界上。该代码利用输入数据集中每个点估计的表面法线
	pcl::BoundaryEstimation<pcl::PointXYZ, pcl::Normal, pcl::Boundary> boundEst; 
	pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> normEst; 
	pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>); 
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_boundary (new pcl::PointCloud<pcl::PointXYZ>); 
	normEst.setInputCloud(pcl::PointCloud<pcl::PointXYZ>::Ptr(cloud)); 
	normEst.setRadiusSearch(reforn); 
	normEst.compute(*normals); 

	boundEst.setInputCloud(cloud); 
	boundEst.setInputNormals(normals); 
	boundEst.setRadiusSearch(re); 
	boundEst.setAngleThreshold(M_PI/4); 
	boundEst.setSearchMethod(pcl::search::KdTree<pcl::PointXYZ>::Ptr (new pcl::search::KdTree<pcl::PointXYZ>)); 
	boundEst.compute(boundaries); 

	for(int i = 0; i < cloud->points.size(); i++) 
	{ 
		
		if(boundaries[i].boundary_point > 0) 
		{ 
			cloud_boundary->push_back(cloud->points[i]); 
		} 
	} 

	boost::shared_ptr<pcl::visualization::PCLVisualizer> MView (new pcl::visualization::PCLVisualizer ("点云库PCL从入门到精通案例"));
	
	int v1(0); 
	MView->createViewPort (0.0, 0.0, 0.5, 1.0, v1); 
	MView->setBackgroundColor (0.3, 0.3, 0.3, v1); 
	MView->addText ("Raw point clouds", 10, 10, "v1_text", v1); 
	int v2(0); 
	MView->createViewPort (0.5, 0.0, 1, 1.0, v2); 
	MView->setBackgroundColor (0.5, 0.5, 0.5, v2); 
	MView->addText ("Boudary point clouds", 10, 10, "v2_text", v2); 

	MView->addPointCloud<pcl::PointXYZ> (cloud, "sample cloud",v1);
	MView->addPointCloud<pcl::PointXYZ> (cloud_boundary, "cloud_boundary",v2);
	MView->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_COLOR, 1,0,0, "sample cloud",v1);
	MView->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_COLOR, 0,1,0, "cloud_boundary",v2);
	MView->addCoordinateSystem (1.0);
	MView->initCameraParameters ();

	MView->spin();

	return 0; 
} 
int
	main(int argc, char** argv)
{
	//是以当前时间为种子,产生随意数。
	//其中,time(NULL)用来获取当前时间,本质上得到的是一个大整数,然后用这个数来随机数。
	//https://www.cnblogs.com/hangaozu/p/8280397.html 介绍这个函数
	srand(time(NULL));

	float re,reforn;
	re=std::atof(argv[2]);//把字符串转换成浮点数
	reforn=std::atof(argv[3]);
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_src (new pcl::PointCloud<pcl::PointXYZ>); 
	pcl::io::loadPCDFile (argv[1], *cloud_src);	
	estimateBorders(cloud_src,re,reforn);

	return 0;
}

结果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PCL_BoundaryEstimation边界提取 的相关文章

  • GNS3-GREvpn

    GREvpn 发一下这些日忙的东西 实验拓扑 以R2为界限的左半边运行ospf 各个链路已经ping通 用R7模拟PC1 PC1和R2的f0 0来回链路没问题 右半边同左半边做相应的配置也成功ping通 在R2和R3之间建立vpn隧道 网段
  • 利用Matlab绘制图像中的某一行或者某一列的灰度曲线

    filename C Users Administrator Desktop 透视变换 包含裂缝的整个图片 123 jpg imgData imread filename imshow imgData 该函数可以用来显示已经读入的数据 A
  • 解决AD中pcb原件移动提示绿色报错问题

    有可能以下三个原因之一所导致的 1 不符合DRC规则 比如原件之间距离过近 就是报错 2 右下角ROOM没有删除 右键清楚就可以啦 3 如果以上两个确证都是正常的 还是报错的话 终极解决方案 step1 在pcb界面下 点击design n
  • 主线3.1DeepFM模型论文阅读:DeepFM: A Factorization-Machine based Neural Network for CTR Prediction

    文章目录 一 摘要 二 模型演变和各模型间的对比 1 CTR的任务要求 2 DeepFM模型的引入 3 各模型间的对比 4 DeepFM优势 三 DeepFM模型介绍 1 FM部分 2 Deep部分 一 摘要 对于一个基于CTR预估的推荐系
  • selenium小项目实践

    1 斗鱼爬虫 爬取斗鱼直播平台的所有房间信息 游戏直播 全部游戏直播 斗鱼直播 1 1 思路分析 数据的位置 每个房间的数据都在id live list contentbox的ul中 实现翻页和控制程序结束 selenium中通过点击就可以
  • 基于麻雀搜索算法(SSA)优化长短期记忆神经网络参数SSA-LSTM冷、热、电负荷预测(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 冷负荷 2 2 热负荷 2 3 电负荷 3 参考文献 4 Python代码 数据 1
  • 虚拟滚动之原理及其封装

    本文分享自微信公众号 一Li小麦 gh c88159ec1309 作者 一li小麦 目前GitHub上只放出demo的版本 将在 https github com dangjingtao vList git 持续更新 前端的业务开发中会遇到
  • python输入输出+文件+OS

    声明 本人的所有博客皆为个人笔记 作为个人知识索引使用 因此在叙述上存在逻辑不通顺 跨度大等问题 希望理解 分享出来仅供大家学习翻阅 若有错误希望指出 感谢 Python输入和输出 输出格式美化 Python三种输出值的方式 表达式语句 p
  • BSN区块链服务网络底十六章

    1 1 简介 服务网络的设计和建设理念完全借鉴互联网 互联网是由TCP IP协议将所有数据中心连接而形成的 服务网络是通过建立一套区块链运行环境协议将所有数据中心连接而组成 与互联网一样 服务网络也是跨云服务 跨门户 跨底层框架的全球性基础
  • MPEG I,B,P的顺序

    MPEG视频压缩算法的特点 数字化后的数据量之大非常惊人 如果不对原始视频图像数据进行压缩 则在与VCD 相同的光盘上只能存储20秒钟的中等分辨率 彩色视频图像 和JVC公司在制定VCD标准时采用了MPEG 1数字图像压缩编码国际标准 IS
  • 【Matlab】矩阵操作

    矩阵操作 生成矩阵 生成行矩阵的方式 冒号表达式 x 1 1 5 1 2 3 4 5 以步长为1 从1到5生成数值 构成行矩阵 若不设置步长 则默认步长为1 linspace a b n linspace 1 5 5 1 2 3 4 5 从
  • JavaScript typeof操作符确认数据类型

    返回 number typeof 1 typeof new Date getTime 返回 undefiend typeof undefined typeof console log 1 先打印1 再打印 undefined 返回 stri
  • Xilinx ISE、MicroBlaze系列教程

    本文是Xilinx MicroBlaze系列教程的第0篇文章 这个系列文章是我个人最近两年使用Xilinx MicroBlaze软核的经验和笔记 以Xilinx ISE 14 7和Spartan 6 Vivado 2018 3和Artix
  • 《TCP/IP网络编程》阅读笔记--并发多进程服务端的使用

    目录 1 并发服务器端 2 进程 2 1 进程的相关概念 2 2 fork 创建进程 2 3 僵尸进程 2 4 wait 和waitpid 销毁僵尸进程 3 信号处理 3 1 signal 函数 3 2 sigaction 函数 3 3 利
  • 熵权法stata程序

    Edited by Linhao Cui 公式部分参考 https wenku baidu com view a2600818bd64783e09122bf6 html 仅供学习交流使用 如有疑问或者问题 欢迎质疑讨论 如有侵权 请联系撤回
  • python 监听 其他程序发消息_python进程之间消息监控程序

    外界调用向mgr进程发送消息 mgr根据不同消息启动或关闭相应进程 启动的进程 独占用 只启动一个 若有进程程退出 则mgr向外界发出信号 外界代码 usr bin python coding utf 8 import sys import
  • 【python环境搭建】一台电脑下安装不同python版本时如何安装模块

    我的环境中安装了2个版本的python 一个时Anaconda的 一个是python3 10 多个版本python的安装 卸载 pip使用 详细方法可以看这个贴子 Windows环境同时安装多个版本的Python解释器 pip的使用 安装p
  • 网络安全笔记6——数字证书与公钥基础设施

    网络安全笔记6 数字证书与公钥基础设施 参考课程 中国大学MOOC 网络安全 北京航空航天大学 文章目录 网络安全笔记6 数字证书与公钥基础设施 公钥基础设施 PKI 证书机构CA Certificate Authority 注册机构RA

随机推荐