估计一个点云的表面法线

news2024/11/29 2:44:10
  • 包含相关头文件
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/features/normal_3d.h>
#include <pcl/visualization/pcl_visualizer.h>
  • 定义了两个类型别名 PointTPointNT,用于表示输入点云和输出点云中各个点的类型。
    输出点云的类型也可以是pcl::Normal,但无法用PCLVisualizer显示。
typedef pcl::PointXYZ PointT;
typedef pcl::PointNormal PointNT;
  • 读取点云,如果点云数据不存在,程序结束 
pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);

if (pcl::io::loadPCDFile<PointT>("../input_cloud/rabbit.pcd", *cloud) == -1)
{
	PCL_ERROR("找不到文件...\n");
	return -1;
}
  • 创建一个 pcl::NormalEstimation 类型的对象 nest,该对象用于进行法线估计运算。在创建这个对象时,需要指定输入点云和输出点云的数据类型。
  • 设置了法线估计中的一个参数 KSearch,表示在计算每个点的法向量时要考虑周围的最近邻点数,这里设置为 50。
  • 输入点云赋值给 nest 对象,并调用 compute() 函数来计算法向量。计算结果存储在一个 pcl::PointCloud<PointNT>::Ptr 类型的指针变量 normals 中。
pcl::NormalEstimation<PointT, PointNT> nest;
//nest.setRadiusSearch(0.01); // 设置拟合时邻域搜索半径,最好用模型分辨率的倍数
nest.setKSearch(50); 
nest.setInputCloud(cloud);
pcl::PointCloud<PointNT>::Ptr normals(new pcl::PointCloud<PointNT>);
nest.compute(*normals);
  • 将原始点云数据中的每个点的坐标信息(x、y、z)复制到法向量点云数据中去。
    生成时只生成了法向量,没有将原始点云信息拷贝,为了显示需要复制原信息
    也可用其他方法进行连接,如:pcl::concatenateFields
    for (size_t i = 0; i < cloud->points.size(); ++i)
    {	
    	normals->points[i].x = cloud->points[i].x;
    	normals->points[i].y = cloud->points[i].y;
    	normals->points[i].z = cloud->points[i].z;
    }
  •  将法向量计算结果和原始点云信息结合起来,并使用 PCL 库中的可视化工具进行展示。
    我们创建了一个 PCL 可视化对象 viewer,并使用 addPointCloud() 函数将原始点云数据添加到可视化对象中,命名为 "cloud"。
    设置了两个参数 levelscale,用于控制法向量集合的显示效果。其中 level 表示多少条法向量集合显示成一条,scale 表示法向量长度的缩放比例。
    调用 viewer.spin() 语句来启动可视化窗口,等待用户交互操作。
pcl::visualization::PCLVisualizer viewer;
viewer.setBackgroundColor(1, 0.6, 0.8,0.2);  // R=255/255, G=153/255, B=204/255	
pcl::visualization::PointCloudColorHandlerCustom<PointT> color_handler(cloud, 0, 255, 0);
viewer.addPointCloud<PointT>(cloud, color_handler, "cloud");
int level = 100;
float scale = 1; 
viewer.addPointCloudNormals<PointNT>(normals, level, scale, "normals");

viewer.spin();

 完整代码:

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
// 包含相关头文件
#include <pcl/features/normal_3d.h>
#include <pcl/visualization/pcl_visualizer.h>

typedef pcl::PointXYZ PointT;
typedef pcl::PointNormal PointNT; // 也可以pcl::Normal,但无法用PCLVisualizer显示。

int main(int argc, char** argv)
{
	// 读取点云
	pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);

	if (pcl::io::loadPCDFile<PointT>("../input_cloud/rabbit.pcd", *cloud) == -1)
	{
		PCL_ERROR("找不到文件...\n");
		return -1;
	}

	// 计算法向量
	pcl::NormalEstimation<PointT, PointNT> nest;
	//nest.setRadiusSearch(0.01); // 设置拟合时邻域搜索半径,最好用模型分辨率的倍数
	nest.setKSearch(50); // 设置拟合时采用的点数
	nest.setInputCloud(cloud);
	pcl::PointCloud<PointNT>::Ptr normals(new pcl::PointCloud<PointNT>);
	nest.compute(*normals);

	for (size_t i = 0; i < cloud->points.size(); ++i)
	{	// 生成时只生成了法向量,没有将原始点云信息拷贝,为了显示需要复制原信息
		// 也可用其他方法进行连接,如:pcl::concatenateFields
		normals->points[i].x = cloud->points[i].x;
		normals->points[i].y = cloud->points[i].y;
		normals->points[i].z = cloud->points[i].z;
	}

	// 显示
	pcl::visualization::PCLVisualizer viewer;
	viewer.setBackgroundColor(1, 0.6, 0.8,0.2);  // R=255/255, G=153/255, B=204/255	
    pcl::visualization::PointCloudColorHandlerCustom<PointT> color_handler(cloud, 0, 255, 0);	
    viewer.addPointCloud<PointT>(cloud, color_handler, "cloud");
	int level = 100; // 多少条法向量集合显示成一条
	float scale = 1; // 法向量长度
	viewer.addPointCloudNormals<PointNT>(normals, level, scale, "normals");

	viewer.spin();

	system("pause");
	return 0;
}

运行效果:

 

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

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

相关文章

Splashtop 在2023年 IT Europa 渠道奖评选活动中当选“特别推荐供应商”

2023年5月24日 加利福尼亚州库比蒂诺 Splashtop 最近在 IT Europa 渠道奖评选活动中&#xff0c;因与 Beyond Digital Solutions 合作的创新客户应用程序而当选年度垂直应用解决方案类别的“特别推荐供应商”。 Beyond Digital Solutions 是一家综合广告公司&#xff0c;主要…

SpringBoot + K8S 中的滚动发布、优雅停机、弹性伸缩、应用监控、配置分离

来源&#xff1a;blog.csdn.net/qq_14999375/article/details/123309636 前言 配置 健康检查 滚动更新 弹性伸缩 Prometheus集成 配置分离 汇总配置 业务层面 运维层面 前言 K8s SpringBoot实现零宕机发布&#xff1a;健康检查滚动更新优雅停机弹性伸缩Prometheus监控…

基于java jsp+mybatis+Spring+的SSM二手交易网站设计实现

基于java jspmybatisSpring的SSM二手交易网站设计实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 …

如何做好软件开发项目管理?

软件越来越多地出现在我们的生活中。为了快速向大众提供这些产品&#xff0c;软件公司必须知道如何有效管理他们的软件项目。 本文将讨论软件项目管理的重要性&#xff0c;以及投资软件项目管理平台的一些好处。 什么是软件开发的项目管理&#xff1f; 软件项目是创建完整的…

车辆管理系统为企业带来4大作用,原来拥有该系统也如此简单

什么是车辆管理系统 车辆管理系统&#xff08;Vehicle Management System&#xff09;是一种用于管理车辆、驾驶员和交通管理的系统。它可以便捷地管理车辆信息&#xff0c;包括车辆的基本信息、行驶记录、保养维修记录、司机信息以及车辆运营成本等。车辆管理系统可以为车队管…

开源赋能 工业铸魂|2023开放原子全球开源峰会开源工业软件分论坛圆满举行

6 月 12 日&#xff0c;由开放原子开源基金会主办&#xff0c;开源工业软件工作委员会&#xff08;以下简称“工委会”&#xff09;承办&#xff0c;工业和信息化部电子第五研究所、哈尔滨工程大学青岛创新发展基地协办的 2023 开放原子全球开源峰会开源工业软件分论坛在京举行…

Linux: 关于blocked for more than 600 seconds的解决方法

背景 在Centos 7的系统日志 /var/log/message中出现大量的 “blocked for more than 600 seconds”和“echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.” 的错误。 如下图所示&#xff1a; 问题原因 默认情况下&#xff0c; Linux最多会使…

这所211非常保护一志愿,录取最低分263分,多个专业上线即录取!

一、学校及专业介绍 云南大学&#xff08;Yunnan University&#xff09;&#xff0c;简称云大&#xff08;YNU&#xff09;&#xff0c;位于云南省昆明市&#xff0c;是教育部与云南省“以部为主、部省合建”的全国重点大学&#xff0c;国家“双一流”建设高校&#xff0c;云南…

EBU5476 Microprocessor System Design 知识点总结_4 Interrupt

Interrupts 比如我们程序的逻辑是按键按下的时候点亮小灯。第一种做法是 Polling 轮询&#xff0c;一直看&#xff1a;按键按下了吗&#xff1f;没有。按下了吗&#xff1f;没。按下了吗&#xff1f;…… 这样主要是效率低浪费CPU资源&#xff0c;如果为了节约资源轮询间隔大…

SpringBoot2.3集成Spring Security(一)

业务背景 首先一个项目最基础的部分一定是登录部分&#xff0c;那么有了登录肯定会有对应的权限校验、身份校验。 那么在没有使用Spring Security之前&#xff0c;大多数设计思路都是通过各种拦截器、监听器来控制用户的访问。但是这种方式&#xff0c;后续的维护会越来越复杂…

组合模式(十二)

请相信自己&#xff0c;请再次相信自己&#xff0c;请一定要相信自己 上一章简单介绍了装饰者模式(十一), 如果没有看过, 请观看上一章 一. 组合模式 引用 菜鸟教程里面的 组合 模式介绍: https://www.runoob.com/design-pattern/composite-pattern.html 组合模式&#xff0…

有多少运维配置防火墙忽略了长连接?

长连接的使用场景 当业务中客户端和服务器长时间无数据交互&#xff0c;空闲时间超过1800秒&#xff0c;会话会因超时被清除。后续客户端没有重新发起连接&#xff0c;直接发送控制报文时导致数据不通。常见于数据库连接。 1. 重点说明 以天为单位的会话超时需要开启长效会话比…

Android 进程间通信机制(六) 手写AIDL文件

阅读本篇文章前, 请先查看一下笔者之前的写的两篇博客文章: Android Service知识 和 Android AIDL使用 进程间通信涉及到客户端和服务端, 肯定有绑定服务的过程, 所以要阅读一下Android Service相关的知识, 跨进程通信的媒介aidl文件,我们也必须要了解怎么创建的,有什么规则…

【Jenkins】全网最详细的自动化测试

学习 Jenkins 自动化测试的系列文章 Robot Framework 概念Robot Framework 安装Pycharm Robot Framework 环境搭建Robot Framework 介绍Jenkins 自动化测试 1. Robot Framework 概念 Robot Framework是一个基于Python的&#xff0c;可扩展的关键字驱动的自动化测试框架。 它…

走进人工智能|GANs AI时代下的前卫艺术

前言&#xff1a; GANs的作用是以生成模型的形式学习数据分布&#xff0c;从而产生逼真的样本数据&#xff0c;可以应用于图像合成、风格转换、视频生成等领域。 文章目录 序言背景适用领域技术支持应用领域程序员如何学总结 序言 GANs&#xff08;生成对抗网络&#xff09;是…

测试为什么分白盒、黑盒、单元、集成测试?

一、为什么测试的概念这么多 一个软件项目就好比一部复杂的汽车&#xff0c;有很多零件&#xff0c;当每个零件生产完成后&#xff0c;就要测试零件是否存在质量问题。零件组成复杂的汽车后&#xff0c;我们还要测试汽车。比如著名的中保研&#xff0c;测试刹车&#xff0c;测…

运维圣经:挖矿木马应急响应指南

目录 挖矿木马简介 挖矿流程 挖矿木马应急响应 一. 隔离被感染主机 二. 确定挖矿进程 三. 挖矿木马清除 1、阻断矿池地址的连接 2、清除挖矿定时任务、启动项等 3、禁用可疑用户 4、定位挖矿木马文件的位置并删除 5、全盘杀毒、加固 挖矿木马简介 挖矿&#xff1a;…

喜报|瑞云科技荣获“年度汽车数字化营销供应商”奖

由iDigital China举办&#xff0c;中国国际贸易促进委员会汽车行业分会战略支持的ADMIC汽车数字化&营销创新峰会暨金璨奖颁奖盛典于2023年4月19日在上海圆满落幕。深圳市瑞云科技股份有限公司受邀参会&#xff0c;现场设有展位&#xff0c;为观众展示实时云渲染如何助力汽车…

实现阿里云域名的DDNS

实现阿里云域名的DDNS 目前现状与痛点 我们在使用ddns的时候会不会遇到这样的问题&#xff1a;路由器只支持指定的域名服务提供商或者是指定的域名&#xff0c;比如我的华为路由器就只支持花生壳&#xff1a; 我想看到这篇文章的小伙伴们应该都把域名注册到中国最大的域名注…

Nginx安装与配置

Nginx安装与配置 一、简介二、安装三、功能与配置3.1、正向代理3.2、反向代理3.3、负责均衡3.4、ip_hash3.5、轮询3.6、加权轮询 四、nginx安全相关配置五、常用命令 一、简介 Nginx是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。 Ngin…