pclpy 点云法线

news2024/9/19 10:37:47

pclpy 点云法线

      • 一、算法原理
          • 1.理论入门
          • 2.选择正确的比例
      • 二、代码
      • 三、结果
      • 四、相关数据

一、算法原理

表面法线是几何表面的重要属性,在许多领域(例如计算机图形应用程序)中大量使用,以应用正确的光源来生成阴影和其他视觉效果。

给定一个几何表面,通常很容易将表面上某个点的法线方向推断为垂直于该点表面的向量。但是,由于我们获取的点云数据集代表了真实表面上的一组点样本,因此有两种可能性:

  • 从获取的点云数据集中获取底层表面,使用表面网格划分技术,然后从网格计算表面法线;
  • 使用近似值直接从点云数据集推断表面法线。
1.理论入门

尽管存在许多不同的法线估计方法,但我们将在本教程中重点介绍的方法是最简单的方法之一,其公式如下。确定表面上一点的法线的问题近似于估计与表面相切的平面的法线的问题,这反过来又变成了最小二乘平面拟合估计问题。

有关更多信息,包括最小二乘问题的数学方程,请参阅pclpy 最小二乘法拟合平面-CSDN博客。

因此,用于估计表面法线的解决方案简化为对从查询点的最近邻居创建的协方差矩阵的特征向量和特征值(或 PCA – 主成分分析)进行分析。更具体地说,对于每个点pi,我们C按如下方式组装协方差矩阵:
在这里插入图片描述

为考虑点邻居的数目在附近 pi,p 表示3D质心最近的邻居,入j是 j)协方差矩阵的特征值第,并且vj 在j个特征向量。

一般来说,因为没有数学方法来求解法线的符号,如上所示通过主成分分析 (PCA) 计算的方向是不明确的,并且在整个点云数据集上的方向不一致。下图展示了这些对代表厨房环境一部分的较大数据集的两个部分的影响。图的右半部分表示扩展高斯图像 (EGI),也称为法线球体,它描述了点云中所有法线的方向。由于数据集是 2.5D,因此是从单个视点获取的,因此法线应仅出现在 EGI 球体的一半上。然而,由于方向不一致,它们遍布整个球体。

在这里插入图片描述

如果观点vp 实际上是已知的,那么这个问题的解决方案是微不足道的。为了使所有法线ni 一致地朝向视点,它们需要满足等式:

在这里插入图片描述

下图显示了上图数据集中的所有法线一致指向视点后的结果。

在这里插入图片描述

2.选择正确的比例

如前所述,一个点的表面法线需要从该点的周围点邻域支持(也称为k-neighborhood)估计 。

最近邻估计问题的细节提出了正确比例因子的问题:给定采样点云数据集,正确的k(通过pcl::Feature::setKSearch给出)或r(通过pcl::Feature给出)是多少 ::setRadiusSearch ) 值应该用于确定一个点的最近邻居集?

这个问题非常重要并且构成了点特征表示的自动估计(即,没有用户给定阈值)的限制因素。为了更好地说明这个问题,下图展示了选择较小尺度(即较小的rk)与较大尺度(即较大的rk )的效果)。图中的左侧部分描绘了一个合理的精心选择的比例因子,两个平面的估计表面法线近似垂直,整个桌子上都可以看到小边缘。然而,如果比例因子太大(右侧部分),因此相邻表面的邻居集合更大,覆盖来自相邻表面的点,则估计的点特征表示会失真,在两个平面的边缘处具有旋转的表面法线,并被涂抹边缘和抑制细节。

在这里插入图片描述

无需涉及太多细节,现在假设必须根据应用程序所需的详细程度来选择确定点邻域的尺度就足够了。简而言之,如果杯子手柄和圆柱部分之间边缘的曲率很重要,则比例因子需要足够小以捕捉这些细节,否则就大。

二、代码

from pclpy import pcl


if __name__ == '__main__':
    # 加载点云
    cloud = pcl.PointCloud.PointXYZ()
    reader = pcl.io.PCDReader()
    reader.read("res/bunny.pcd", cloud)
    print(cloud.size())  # 打印点云的数目
    # 构造法线估计类
    ne = pcl.features.NormalEstimation.PointXYZ_Normal()  # 法线对象
    ne.setInputCloud(cloud)  # 将cloud放入到ne中

    tree = pcl.search.KdTree.PointXYZ()  # 建立kd搜索树
    ne.setSearchMethod(tree)

    cloud_normals = pcl.PointCloud.Normal() 
    ne.setRadiusSearch(0.03)  # 设置半径搜索领域0。03m
    # 计算法线
    ne.compute(cloud_normals)  # 计算法线
    print(cloud_normals.size())  # 打印法线的数目

三、结果

[output]
点云数目: 35947
法线数目: 35947

四、相关数据

法线估计官网:Normal Estimation Using Integral Images — Point Cloud Library 0.0 documentation (pcl.readthedocs.io)

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

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

相关文章

先进电机技术 —— 通用变频器

一、变频器名称定义 通用变频器(Variable Frequency Drive, VFD)是一种广泛应用于工业控制领域的电力电子设备,其主要功能是改变供电电源的频率和电压,以达到对交流电动机转速进行精确、连续调节的目的。通用变频器通常具备以下特…

2023年12月CCF-GESP编程能力等级认证Scratch图形化编程三级真题解析

一、单选题(共15题,共30分) 第1题 现代计算机是指电子计算机,它所基于的是( )体系结构。 A:艾伦图灵 B:冯诺依曼 C:阿塔纳索夫 D:埃克特-莫克利 答案:B 第2题 默认小猫角色,执行下列程序,舞台上会看到? ( ) A: B: C: D: 答案:C

数据库-第二/三章 关系数据库和标准语言SQL【期末复习|考研复习】

前言 总结整理不易,希望大家点赞收藏。 给大家整理了一下计数据库系统概论中的重点概念,以供大家期末复习和考研复习的时候使用。 参考资料是王珊老师和萨师煊老师的数据库系统概论(第五版)。 文章目录 前言第二、三章 关系数据库和标准语言SQL2.1 关系2…

Unity RectTransform·屏幕坐标转换

RectTransform转屏幕坐标 分两种情况 Canvas渲染模式为Overlay时,使用此方式 public Rect GetScreenCoordinatesOfCorners(RectTransform rt) {var worldCorners new Vector3[4];rt.GetWorldCorners(worldCorners);var result new Rect(worldCorners[0].x,world…

Redis--持久化机制详解

什么是redis持久化? Redis持久化是将内存的数据持久化到磁盘上,防止Redis宕机或者断点的时候内存中的数据丢失,把内存中的数据写入到磁盘的过程叫持久化。 Redis持久化的方式? RDB(Redis DataBase)&…

无法调试MFC源码

VS无法调试MFC源码 起初 有时候就是这么无奈,MFC源码各种问题没有办法调试,可是又想看下代码如何调用,里面做了些什么,从哪儿调出,学习一下大神的思路什么的。整理一下有可能的原因。 检查生成代码设置 需要设置正…

echarts vue 动画效果的水球图、波浪图教程

1、安装插件 前提是已经安装了echarts(我的版本是4.2.1) npm install echarts-liquidfill --save 我安装了3.1.0版本的,结果运行时报错"TypeError: wave.ensureState is not a function" 原因:echarts版本和echarts-l…

每周一算法:双端队列广搜

题目链接 电路维修 题目描述 达达是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女翰翰,从而被收留在地球上。翰翰的家里有一辆飞行车。有一天飞行车的电路板突然出现了故障,导致无法启动。 电路板的整体结…

JavaSE——常用API(2/3)-String使用时的注意事项、String的应用案例

目录 String使用时的注意事项 阅读程序并解答(1) 阅读程序并解答(2) String的应用案例 案例1 案例2 小结 String使用时的注意事项 String对象的内容不可改变,被称为不可变字符串对象。(每次试图改变…

软考 系统分析师系列知识点之需求获取(7)

所属章节: 第11章. 软件需求工程 第2节. 需求获取 需求获取是一个确定和理解不同的项目干系人的需求和约束的过程。需求获取是一件看上去很简单、做起来却很难的事情。需求获取是否科学、准备是否充分,对获取出来的结果影响很大,这是因为大部…

每日学习总结20240228

每日总结 20240228 1.获取系统命令执行结果 #include <stdio.h>#define TRUE 1 #define FALSE 0int get_system_cmd_result(const char *command, char *buffer, int bufferLen) {FILE *pipe popen(command, "r");if (pipe NULL) {return FALSE;}while (f…

winform 自定义组件 之踩坑 自定义属性属性列表不展示

问题描述&#xff1a; 使用winform 自定义组件&#xff0c;定义自定义属性性&#xff0c; 使用自定义组件属性页面不展示。 百度N次无解 问了AI 发现犯了个低智错误&#xff1a; 属性末设置为 public; 解决方案一&#xff1a;

NLP Seq2Seq模型

&#x1f368; 本文为[&#x1f517;365天深度学习训练营学习记录博客&#x1f366; 参考文章&#xff1a;365天深度学习训练营&#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制]\n&#x1f680; 文章来源&#xff1a;[K同学的学习圈子](https://www.yuque.com/mi…

等概率事件算法

1等概率的生成(0-8)范围内的正整数 // Math.random 数据范围[0,1) 且 是 等概率的产生随机数 // 应用&#xff1a; // 1.生成等概率的整数&#xff08;等概率的生成(0-8)范围内的正整数 int value (int) (Math.random() * 9); System.out.println("value "…

YOLOv9有效提点|加入BAM、CloFormer、Reversible Column Networks、Lskblock等几十种注意力机制(二)

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、本文介绍 本文只有代码及注意力模块简介&#xff0c;YOLOv9中的添加教程&#xff1a;可以看这篇文章。 YOLOv9有效提点|加入SE、CBAM、ECA、SimA…

逆变器专题(13)-逆变器LCL滤波器设计

相应仿真原件请移步资源下载 随着新能源的蓬勃发展&#xff0c;逆变器作为光伏储能的核心电力电子器件之一&#xff0c;其也得到了大力发展&#xff1b;传统的L型以及LC型滤波器因其体积较大、滤波效果差等原因已经被逐渐替代&#xff0c; LCL滤波器因其具有较小的体积&#xf…

JavaWeb HTTP 请求头、请求体、响应头、响应体、响应状态码

J2EE&#xff08;Java 2 Platform Enterprise Edition&#xff09;是指“Java 2企业版”&#xff0c;B/S模式开发Web应用就是J2EE最核心的功能。 Web是全球广域网&#xff0c;也称为万维网(www)&#xff0c;能够通过浏览器访问的网站。 在日常的生活中&#xff0c;经常会使用…

通过GitHub探索Python爬虫技术

1.检索爬取内容案例。 2.找到最近更新的。(最新一般都可以直接运行) 3.选择适合自己的项目&#xff0c;目前测试下面画红圈的是可行的。 4.方便大家查看就把代码粘贴出来了。 #图中画圈一代码 import requests import os import rewhile True:music_id input("请输入歌曲…

编译链接实战(22)C/C++代码覆盖率统计报告生成

文章目录 GCOV 工具简介gcov 使用lcov相关编译选项 GCOV 工具简介 gcov是一个测试代码覆盖率的工具&#xff0c;它是 gcc 自带的查看代码覆盖率的工具。 与GCC结合使用&#xff0c;可以分析您的程序以帮助创建更高效、运行更快的代码&#xff0c;并发现程序中未经测试的部分。…

Linux 之压缩与解压相关命令的基础用法

目录 1、zip 与 unzip 2、gzip 命令 3、tar 命令 1、zip 与 unzip 在桌面新建一个文件和文件夹用于测试 在 test 目录下有一个 1.txt 文件 我们使用 zip 命令对其压缩 用法&#xff1a; zip 自定义压缩包名 被压缩文件路径位置 zip myon.zip 1.txt 因为我们这里就是在 …