pclpy 点云法线

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 pclif __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.mzph.cn/news/713129.shtml

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

相关文章

Android 混淆是啥玩意儿?

什么是混淆 Android混淆,是伴随着Android系统的流行而产生的一种Android APP保护技术,用于保护APP不被破解和逆向分析。简单的说,就是将原本正常的项目文件,对其类、方法、字段,重新命名a,b,c…之类的字母&#xff0c…

森林灭火利器|便携式森林消防灭火泵|恒峰智慧科技

随着人们对环境保护意识的不断提高,森林防火工作显得尤为重要。然而,传统的森林灭火方式存在诸多不便,如火势蔓延迅速、灭火效率低下等。为了更好地保护森林资源,科学家们研发出了一种便携式森林消防灭火泵,它的出现为…

利用css实现常见图形

1、正圆形 给正方形盒子设置圆角属性为宽高的50%。 div {width: 100px;height: 100px;background-color: plum;border-radius: 50%; } 2、胶囊形 给长方形盒子设置圆角属性为盒子高度的50%。 div {width: 200px;height: 100px;background-color: plum;border-radius: 50px…

基于C#开发OPC DA客户端——基于OPCDAAuto

OPC DA OPC DA(OPC Data Access),即OPC数据访问接口,定义了数据交换的规范,包括:过程值、更新时间、数据品质等信息。 自动化接口中共定义了6类对象:OPCServer对象、OPCBrowser对象、OPCGroups对象、OPCGroup对象、O…

如何做代币分析:以 SHIB 币为例

作者:lesleyfootprint.network 编译:cicifootprint.network 数据源:SHIB Token Dashboard (仅包括以太坊数据) 在加密货币和数字资产领域,代币分析起着至关重要的作用。代币分析指的是深入研究与代币相关…

保姆教程 Docker 部署微服务项目

大家好,我是奇兵。 文章比较长,请耐心看完! 项目上线是每位学编程同学必须掌握的基本技能。之前我已经给大家分享过很多种上线单体项目的方法了,今天再出一期微服务项目的部署教程,用一种最简单的方法,带…

备战蓝桥杯Day18 - 双链表

一、每日一题 蓝桥杯真题之工作时长 这个题写代码做的话很麻烦,而且我也不一定能写出来,所以我直接就是用的excel来计算的时间和。 使用excel的做法 1.先把文件中的时间复制到excel中。 2.把日期和时间分到两列。 分成两列的步骤: 选中要…

基于单片机的节能窗控制系统设计

摘 要:本文以单片机为基础,对节能窗控制系统进行了科学设计,在满足日常生活需求的同时更好地实现节能减排目标。此设计中的节能窗控制系统,实际操作要灵活,具备可靠且稳定的性能,同时具备节能功效。 关键词:单片机;节能窗控制系统;系统设计 在节能窗等概念推广的背景…

css实现一行靠右,多行靠左

利用 inline-block 可以根据内容宽度变化的特性 如果内容多到折行了&#xff0c;那自身的宽度会和父级同宽&#xff0c;同宽后&#xff0c;产生折行&#xff0c;这时候就生效了… <!DOCTYPE html> <html lang"en"> <head><meta charset"U…

Atcoder ABC342 E - Last Train

Last Train&#xff08;最后一班火车&#xff09; 时间限制&#xff1a;2s 内存限制&#xff1a;1024MB 【原题地址】 所有图片源自Atcoder&#xff0c;题目译文源自脚本Atcoder Better! 点击此处跳转至原题 【问题描述】 【输入格式】 【输出格式】 【样例1】 【样例输入…

2. this 指向问题

this 指向问题 前言 当一个函数调用时&#xff0c;会创建一个执行上下文&#xff0c;这个上下文包括函数调用的一些信息(调用栈&#xff0c;传入参数&#xff0c;调用方式)&#xff0c;this就指向这个执行上下文。 this 不是静态的&#xff0c;也并不是在编写的时候绑定的&am…

Linux笔记-1

概述 简介 Linux是现在服务器上最常用的操作系统(OS - Operating system) - 所谓的操作系统本质上也是一个软件&#xff0c;是一个可以运行其他软件的容器如果一台服务器&#xff0c;没有安装操作系统&#xff0c;此时称之为裸机。裸机可以使用&#xff0c;在使用的时候需要使…

istio pod不启动及访问报RBAC错误问题解决

istio pod不启动问题解决 在kubernetes集群中安装istio之后&#xff0c;在创建的depoyment中已经使用了注入注解sidecar.istio.io/inject: true’配置&#xff0c;但是istio pod不创建&#xff0c;代码示例如下 kind: Deployment apiVersion: apps/v1 metadata:name: name-an…

力扣SQL50 大的国家 查询

Problem: 595. 大的国家 Code select name,population,area from World where area > 3000000 or population > 25000000;

Sora引发安全新挑战

文章目录 前言一、如何看待Sora二、Sora加剧“深度伪造”忧虑三、Sora无法区分对错四、滥用导致的安全危机五、Sora面临的安全挑战总结前言 今年2月,美国人工智能巨头企业OpenAI再推行业爆款Sora,将之前ChatGPT以图文为主的生成式内容全面扩大到视频领域,引发了全球热议,这…

【Leetcode每日一题】二分查找 - LCR 173. 点名(难度⭐)(24)

1. 题目解析 Leetcode题目链接&#xff1a;LCR 173. 点名 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 核心在于找到题目所给的连续数组中缺失的数字即可。 2.算法原理 在这个升序的数组中&#xff0c;我们发现&#xff1a; …

Fastadmin下拉选择菜单

下拉菜单效果图如下所示 对应的表字段为 cid int(11) unsigned NOT NULL DEFAULT ‘1’ COMMENT ‘分类ID 1 新手 2VIP 3基金产品’ 步骤如下&#xff1a; 一、lang/zh-cn 中找到对应的文件&#xff0c;添加 配置 二、Model 中添加方法 三、控制器中添加 四、add.html中 …

机器学习高手之路:发现TensorFlow学习网站的无限可能!

介绍&#xff1a;TensorFlow是一个由Google团队开发的端到端开源机器学习平台&#xff0c;专为数值计算和机器学习而设计。以下是对TensorFlow的详细介绍&#xff1a; 开发背景与历史&#xff1a;TensorFlow起源于谷歌的神经网络算法库DistBelief。它被设计成一个灵活的深度学习…

go并发模式之----工作池/协程池模式

常见模式之四&#xff1a;工作池/协程池模式 定义 顾名思义&#xff0c;就是有固定数量的工人&#xff08;协程&#xff09;&#xff0c;去执行批量的任务 使用场景 适用于需要限制并发执行任务数量的情况 创建一个固定大小的 goroutine 池&#xff0c;将任务分发给池中的 g…

顺序表基础

⽬录 1. 课前准备 2. 顺序表概念及结构 3. 顺序表分类 4. 实现动态顺序表 正⽂开始 课前预备 1. 课程⽬标 C语⾔语法基础到数据结构与算法&#xff0c;前⾯已经掌握并具备了扎实的C语⾔基础&#xff0c;为什么要学习数据结构 课程&#xff1f;⸺通讯录项⽬ 2. 需要…