PCL 点云基于曲率大小渲染颜色

目录

一、概述

1.1原理

1.2实现步骤

1.3应用场景

二、代码实现

2.1关键函数

2.2完整代码

三、实现效果

3.1原始点云

3.2处理后点云


PCL点云算法汇总及实战案例汇总的目录地址链接:

PCL点云算法与项目实战案例汇总(长期更新)


一、概述

1.1原理

        曲率是衡量点云中某一点周围表面弯曲程度的指标。通过计算每个点的曲率,可以将曲率值映射为颜色,从而在点云中更直观地表现表面特征。曲率值越大,表面越尖锐或复杂。PCL 提供了计算曲率和将曲率值映射为颜色的功能,允许我们根据曲率值对点云进行可视化渲染。

        具体地,曲率 𝐶 的计算公式如下:

        其中,𝜆0≤𝜆1≤𝜆2是协方差矩阵的特征值。通过将计算得到的曲率值映射为颜色,可以在点云的可视化中突出显示表面的不同特征。

1.2实现步骤

  1. 计算点云的法向量和曲率。
  2. 创建并设置颜色映射,将曲率值映射为颜色。
  3. 使用设置的颜色显示点云。

1.3应用场景

  • 表面特征分析通过渲染曲率,可以识别和分析点云中的边缘、角点等表面特征。
  • 物体分类与识别:在三维重建中,通过曲率渲染可以帮助更好地识别物体的形状和类型。
  • 质量控制与检测:在工业检测中,通过曲率分析和渲染,可以识别产品表面的缺陷,如刮痕或凸起。

二、代码实现

2.1关键函数

1.计算法向量和曲率:

  • pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal>:用于估算点云中每个点的法向量和曲率。
  • pcl::search::KdTree<pcl::PointXYZ>:用于支持法向量估算的近邻搜索。

2.颜色映射:

  • pcl::PointCloud<pcl::PointXYZRGB>:用于存储带颜色信息的点云。
  • pcl::visualization::PCLVisualizer 和 addPointCloud:用于将颜色映射后的点云添加到可视化窗口中进行显示。

2.2完整代码

#include <pcl/io/pcd_io.h>
#include <pcl/features/normal_3d.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/point_cloud.h>
#include <pcl/common/common.h>int main(int argc, char** argv)
{// 1. 创建一个用于存储点云数据的PointCloud智能指针对象pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);// 2. 读取PCD格式的点云文件到cloud对象中if (pcl::io::loadPCDFile<pcl::PointXYZ>("bunny.pcd", *cloud) == -1){PCL_ERROR("Couldn't read the PCD file \n");return (-1);}// 3. 创建法向量估计对象,并设置输入点云pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;ne.setInputCloud(cloud);// 4. 创建一个KdTree对象用于近邻搜索,这在计算法向量时会用到pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());ne.setSearchMethod(tree);// 5. 创建一个用于存储法向量和曲率的PointCloud对象pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>);// 6. 设置估算法向量时的搜索半径,这个半径决定了在计算法向量和曲率时考虑的邻域范围ne.setRadiusSearch(0.03);// 7. 计算法向量和曲率,并将结果存储在cloud_normals中ne.compute(*cloud_normals);// 8. 创建一个带颜色信息的点云对象,用于存储根据曲率设置颜色后的点云数据pcl::PointCloud<pcl::PointXYZRGB>::Ptr colored_cloud(new pcl::PointCloud<pcl::PointXYZRGB>);colored_cloud->width = cloud->width;colored_cloud->height = cloud->height;colored_cloud->points.resize(cloud->points.size());// 9. 遍历每个点,将曲率值映射为颜色,并赋值给colored_cloudfor (size_t i = 0; i < cloud->points.size(); ++i){// 将原始点云中的坐标信息复制到有颜色的点云对象中colored_cloud->points[i].x = cloud->points[i].x;colored_cloud->points[i].y = cloud->points[i].y;colored_cloud->points[i].z = cloud->points[i].z;// 获取当前点的曲率值float curvature = cloud_normals->points[i].curvature;// 根据曲率值设置颜色,曲率大的点用红色表示,曲率小的点用蓝色表示uint8_t r = static_cast<uint8_t>(255 * curvature); // 红色分量uint8_t g = 0;                                     // 绿色分量uint8_t b = static_cast<uint8_t>(255 * (1.0 - curvature)); // 蓝色分量// 将颜色值组合成一个32位整数,并赋给点的rgb字段uint32_t rgb = (static_cast<uint32_t>(r) << 16 |static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));colored_cloud->points[i].rgb = *reinterpret_cast<float*>(&rgb);}// 10. 创建一个PCLVisualizer对象,用于可视化点云数据pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("Curvature Viewer"));// 11. 设置可视化窗口的背景色为黑色viewer->setBackgroundColor(0, 0, 0);// 12. 将带颜色信息的点云添加到可视化窗口中,并设置显示属性viewer->addPointCloud<pcl::PointXYZRGB>(colored_cloud, "colored cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "colored cloud");// 13. 进入可视化循环,直到用户关闭窗口while (!viewer->wasStopped()){viewer->spinOnce(100);}return 0;
}

三、实现效果

3.1原始点云

3.2处理后点云

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

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

相关文章

Django笔记一:搭建Django环境与URL路径访问

博主之前学从Java后端开发&#xff0c;后面获取到读研资格&#xff0c;想着未来转算法岗&#xff0c;初学Python&#xff0c;发现Python还挺有趣的&#xff0c;由于之前所学后端缘故&#xff0c;有点后端情节&#xff0c;想学习一下Django框架&#xff08;python的web框架&…

人工智能和机器学习:探讨人工智能和机器学习的最新发展、应用、挑战和未来趋势

人工智能和机器学习是当前科技领域的热点话题&#xff0c;其最新发展、应用、挑战和未来趋势备受关注。 最新发展&#xff1a; 人工智能和机器学习技术在近年来得到了快速发展&#xff0c;尤其是深度学习技术的广泛应用。例如&#xff0c;深度学习在图像识别、语音识别、自然语…

react 基础语法

前置知识 类的回顾 通过class关键字定义一个类 类名首字母大写 class类有constructor构造器 new 一个类得到一个实例 类还有方法&#xff0c;该方法也会在其原型上 static静态数据&#xff0c;访问静态属性通过 类名.id getter和setter getter&#xff1a;定义一个属性&…

网络学习-eNSP配置VRRP

虚拟路由冗余协议(Virtual Router Redundancy Protocol&#xff0c;简称VRRP) VRRP广泛应用在边缘网络中&#xff0c;是一种路由冗余协议&#xff0c;它的设计目标是支持特定情况下IP数据流量失败转移不会引起混乱&#xff0c;允许主机使用单路由器&#xff0c;以及即使在实际…

全球NAND原厂闪存市场格局变化

根据市场研究机构TrendForce的最新跟踪报告&#xff0c;三星&#xff08;Samsung&#xff09;和SK海力士&#xff08;SK hynix-Solidigm&#xff09;在过去的一个季度中扩大了他们在NAND闪存市场的份额&#xff0c;这主要得益于抢占了铠侠&#xff08;Kioxia&#xff09;与西部…

小目标检测顶会新思路!最新成果刷爆遥感SOTA,参数小了18倍

遥感领域的小目标检测一直是个具有挑战性和趣味性的研究方向&#xff0c;同时也是顶会顶刊的常客。但不得不说&#xff0c;今年关于遥感小目标检测的研究热情尤其高涨&#xff0c;已经出现了很多非常优秀的成果。 比如SuperYOLO方法&#xff0c;通过融合多模态数据并执行高分辨…

【重学 MySQL】二十八、SQL99语法新特性之自然连接和 using 连接

【重学 MySQL】二十八、SQL99语法新特性之自然连接和 using 连接 自然连接&#xff08;NATURAL JOIN&#xff09;USING连接总结 SQL99语法在SQL92的基础上引入了一些新特性&#xff0c;其中自然连接&#xff08;NATURAL JOIN&#xff09;和USING连接是较为显著的两个特性。 自…

数据结构(14)——哈希表(1)

欢迎来到博主的专栏&#xff1a;数据结构 博主ID&#xff1a;代码小豪 文章目录 哈希表的思想映射方法&#xff08;哈希函数&#xff09;除留余数法 哈希表insert闭散列负载因子扩容find和erase 哈希表的思想 在以往的线性表中&#xff0c;查找速度取决于线性表是否有序&#…

知识库管理系统在企业数字化转型中的作用

引言 在数字化转型的浪潮中&#xff0c;企业正以前所未有的速度重塑其业务模式、运营流程和组织架构&#xff0c;以适应快速变化的市场环境和客户需求。这一过程中&#xff0c;知识库管理系统作为信息整合与知识共享的核心平台&#xff0c;发挥着举足轻重的作用&#xff0c;不…

【解决】AnimationCurve 运行时丢失数据问题

开发平台&#xff1a;Unity 2022 编程平台&#xff1a;Visual Studio 编程语言&#xff1a;CSharp   一、问题背景 如上图所示的 GracityComponent 组件中&#xff0c;引用 AnimationCurve 作为可调属性。但在实际使用中出现数据丢失问题。大致为以下两种情况&#xff1a; 运…

【重学 MySQL】二十七、七种 join 连接

【重学 MySQL】二十七、七种 join 连接 union 的使用UNION 的基本用法示例UNION ALL 的用法 七种 join 连接代码实现语法格式小结 union 的使用 UNION 在 SQL 中用于合并两个或多个 SELECT 语句的结果集&#xff0c;并默认去除重复的行。如果希望包含重复行&#xff0c;可以使…

RNN发展(RNN/LSTM/GRU/GNMT/transformer/RWKV)

RNN到GRU参考&#xff1a; https://blog.csdn.net/weixin_36378508/article/details/115101779 tRANSFORMERS参考&#xff1a; seq2seq到attention到transformer理解 GNMT 2016年9月 谷歌,基于神经网络的翻译系统&#xff08;GNMT&#xff09;&#xff0c;并宣称GNMT在多个主…

java程序员入行科目一之CRUD轻松入门教程(二)

封装工具类 封装获取连接&释放资源操作 在实际使用JDBC的时候&#xff0c;很多操作都是固定的&#xff0c;没有必要每次都去注册驱动&#xff0c;获取链接对象等等。 同样&#xff0c;释放资源的close操作也可以封装一下 下面是封装好的具体工具类 package com.jimihua.u…

海外云手机是否适合运营TikTok?

随着科技的迅猛发展&#xff0c;海外云手机逐渐成为改变工作模式的重要工具。这种基于云端技术的虚拟手机&#xff0c;不仅提供了更加便捷、安全的使用体验&#xff0c;还在电商引流和海外社媒管理等领域展示了其巨大潜力。那么&#xff0c;海外云手机究竟能否有效用于运营TikT…

mosh java 2.4 inheritance继承

1.面向对象编程的第三个特点 继承 继承的好处 java不能继承多个父级 代码文件结构 1.main.java package org.example; //package org.codewithme;//import org.example.UIControl;//TIP To <b>Run</b> code, press <shortcut actionId"Run"/> or /…

3C电子胶黏剂在手机制造方面有哪些关键的应用

3C电子胶黏剂在手机制造方面有哪些关键的应用 3C电子胶黏剂在手机制造中扮演着至关重要的角色&#xff0c;其应用广泛且细致&#xff0c;覆盖了手机内部组件的多个层面&#xff0c;确保了设备的可靠性和性能。以下是电子胶在手机制造中的关键应用&#xff1a; 手机主板用胶&…

率先搭载存内计算AI芯片,维迈通引领骑行通讯降噪革新

近日&#xff0c;高端骑行头盔耳机领导品牌维迈通&#xff08;VIMOTO&#xff09;三款新品XR、V10S、V10X全平台正式发售&#xff0c;创新搭载了知存科技&#xff08;Witmem&#xff09;高能效存内计算AI芯片&#xff0c;为骑行爱好者带来更极致的AI降噪体验。 作为一家专注摩托…

状压DP

状压DP 对于数据范围n<20的可以考虑状压DP 1.蒙德里安的梦想 题目描述 求把 N M NM NM 的棋盘分割成若干个 12 的的长方形&#xff0c;有多少种方案。 例如当$ N2&#xff0c;M4$ 时&#xff0c;共有 5 种方案。当 N 2 &#xff0c; M 3 N2&#xff0c;M3 N2&…

windows 创建新用户,并分配到指定组

右击电脑 -> 点击管理 在右边右击&#xff0c;选择新用户&#xff0c;输入相关信息创建 创建用户后&#xff0c;选择用户&#xff0c;右击&#xff0c;选择属性&#xff0c;添加 点击高级 点击立即查找&#xff0c;可以搜索出所有可用的组&#xff0c;为其选择即可

Java XML

1、XML文件介绍 配置文件&#xff1a;用来保存设置的一些东西。 拿IDEA来举例&#xff0c;比如设置的背景图片&#xff0c;字体信息&#xff0c;字号信息和主题信息等等。 &#xff08;1&#xff09;以前是用txt保存的&#xff0c;没有任何优点&#xff0c;而且不利于阅读&a…