点云法线计算原理

news/2024/7/7 21:26:58

1、背景

点云数据只是一种基本的、对物理目标三维结构的理解形式,一般无法直接使用。从点云重建网格模型的关键是从离散点构造出拓扑连接关系。

对于点云来说,法线是很重要的一个属性。

  • 点云渲染:在进行光照渲染时需要发现信息才能正常进行。
  • 点云重建:用于计算点到隐式曲面的有符号几何距离,从而构建隐式曲面。
  • 其他:区分正反面。

2、法线计算原理

确定表面一点法线的问题近似于估计表面的一个相切面法线的问题,因此转换过来以后就变成一个最小二乘法平面拟合估计问题。

对一个平面来说,可以使用法线方式表示一个平面, a x + b y + c z = d ( d > = 0 ) , a 2 + b 2 + c 2 = 1 ax+by+cz=d(d>=0),a^2+b^2+c^2=1 ax+by+cz=d(d>=0),a2+b2+c2=1。为了使得平面最准确,则使用最小二乘法构造代价函数:

d i = ∣ a x + b y + c z − d ∣ d_i=\lvert ax+by+cz-d \rvert di=ax+by+czd

则目标是求 m i n ∑ i = 1 n d i 2 min\sum_{i=1}^nd_i^2 mini=1ndi2, a 2 + b 2 + c 2 = 1 a^2+b^2+c^2=1 a2+b2+c2=1

  • 构造拉格朗日:

f = ∑ i = 1 n d i 2 − λ ( a 2 + b 2 + c 2 − 1 ) f=\sum_{i=1}^nd_i^2-\lambda(a^2+b^2+c^2-1) f=i=1ndi2λ(a2+b2+c21)

f对d求导则,
d = 1 n ( a ∑ i = 1 n x i + b ∑ i = 1 n y i + c ∑ i = 1 n z i ) = a x ‾ + b y ‾ + c z ‾ d=\frac{1}{n}(a\sum_{i=1}^{n}x_i+b\sum_{i=1}^{n}y_i+c\sum_{i=1}^{n}z_i)=a\overline x+b\overline y+c\overline z d=n1(ai=1nxi+bi=1nyi+ci=1nzi)=ax+by+cz

d i = ∣ a x i + b y i + c z i − a x ‾ + b y ‾ + c z ‾ ∣ = ∣ a Δ x i + b Δ b i + c Δ z i ∣ d_i=\lvert ax_i+by_i+cz_i-a\overline x+b\overline y+c\overline z \rvert=\lvert a\Delta x_i+b\Delta b_i+c\Delta z_i \rvert di=axi+byi+cziax+by+cz=aΔxi+bΔbi+cΔzi

Δ x i = x i − x ˉ , Δ y i = y i − y ˉ , Δ z i = z i − z ˉ \Delta x_i=x_i-\bar x,\Delta y_i=y_i-\bar y,\Delta z_i=z_i-\bar z Δxi=xixˉ,Δyi=yiyˉ,Δzi=zizˉ d i = ∣ a Δ x i + b Δ b i + c Δ z i ∣ d_i=\lvert a\Delta x_i+b\Delta b_i+c\Delta z_i \rvert di=aΔxi+bΔbi+cΔzi

  • 另一边,f分别对a、b、c求导:

∂ f ∂ a = 2 ∑ i = 1 n ( a Δ x i + b Δ b i + c Δ z i ) Δ x i − 2 λ a \frac{\partial f}{\partial a}=2\sum_{i=1}^n(a\Delta x_i+b\Delta b_i+c\Delta z_i)\Delta x_i-2\lambda a af=2i=1n(aΔxi+bΔbi+cΔzi)Δxi2λa

∂ f ∂ b = 2 ∑ i = 1 n ( a Δ x i + b Δ b i + c Δ z i ) Δ y i − 2 λ b \frac{\partial f}{\partial b}=2\sum_{i=1}^n(a\Delta x_i+b\Delta b_i+c\Delta z_i)\Delta y_i-2\lambda b bf=2i=1n(aΔxi+bΔbi+cΔzi)Δyi2λb

∂ f ∂ c = 2 ∑ i = 1 n ( a Δ x i + b Δ b i + c Δ z i ) Δ z i − 2 λ c \frac{\partial f}{\partial c}=2\sum_{i=1}^n(a\Delta x_i+b\Delta b_i+c\Delta z_i)\Delta z_i-2\lambda c cf=2i=1n(aΔxi+bΔbi+cΔzi)Δzi2λc


[ ∑ Δ x i 2 ∑ Δ x i Δ y i ∑ Δ x i Δ z i ∑ Δ x i Δ y i ∑ Δ y i 2 ∑ Δ y i Δ z i ∑ Δ x i Δ z i ∑ Δ y i Δ z i ∑ Δ z i 2 ] [ a b c ] = λ [ a b c ] \left[\begin{matrix} \sum \Delta x_i^2 & \sum \Delta x_i\Delta y_i & \sum \Delta x_i\Delta z_i \\ \sum \Delta x_i\Delta y_i & \sum \Delta y_i^2 & \sum \Delta y_i\Delta z_i \\ \sum \Delta x_i\Delta z_i & \sum \Delta y_i\Delta z_i & \sum \Delta z_i^2 \end{matrix}\right] \left[\begin{matrix} a \\ b \\ c \end{matrix}\right]= \lambda \left[\begin{matrix} a \\ b \\ c \end{matrix}\right] Δxi2ΔxiΔyiΔxiΔziΔxiΔyiΔyi2ΔyiΔziΔxiΔziΔyiΔziΔzi2 abc =λ abc
则需要求的 ( a , b , c ) (a,b,c) (a,b,c)即为 λ \lambda λ特征值对应的特征向量。

对于上面左右同时乘 [ a b c ] \left[\begin{matrix}a & b & c \end{matrix}\right] [abc],即 λ = ∑ i = 1 n ( a Δ x i + b Δ b i + c Δ z i ) 2 = ∑ i = 1 n d i 2 \lambda=\sum_{i=1}^{n}(a\Delta x_i+b\Delta b_i+c\Delta z_i)^2=\sum_{i=1}^nd_i^2 λ=i=1n(aΔxi+bΔbi+cΔzi)2=i=1ndi2.
则我们的目标就是求最小特征值对应的特征向量。

3、pcl库计算法向量

	pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n;//创建法向估计对象
	pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);//创建法向数据指针
	pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);//创建kdtree用于法向计算时近邻搜索
	tree->setInputCloud(cloud);//为kdtree输入点云
	n.setInputCloud(cloud);//为法向估计对象输入点云
	n.setSearchMethod(tree);//设置法向估计时采用的搜索方式为kdtree
	n.setKSearch(20);//设置法向估计时,k近邻搜索的点数
	n.compute(*normals);  //进行法向估计

http://lihuaxi.xjx100.cn/news/1137634.html

相关文章

死锁、生产者和消费者问题

目录 生产者和消费者问题 死锁的概念 内存的基础知识 内存管理的概念 覆盖与交换 介绍一下PCB 连续分配管理方式​编辑 生产者和消费者问题 死锁的概念 什么是死锁 进程死锁、饥饿、死循环的区别 死锁产生的必要条件 什么时候会发生死锁 死锁的处理策略 内存的基础知识 内存…

{嵌入式操作系统}我国为什么要自主研发国产嵌入式操作系统

嵌入式操作系统不同于传统的桌面操作系统&#xff0c;用户不能直接执行它们&#xff0c;不同于桌面操作系统的无处不在&#xff0c;嵌入式操作系统隐藏在我们的视野之外&#xff0c;很多人甚至不知道它们的存在。 什么是嵌入式操作系统&#xff0c;它与非嵌入式操作系统有何不…

怎么把文本翻译成英文?安利三个文本翻译方法

在当今全球化的时代&#xff0c;跨国交流和合作已经成为常态。然而&#xff0c;不同语言之间的沟通障碍经常阻碍着信息传递和理解。为了帮助我们更好地进行国际交流&#xff0c;文本翻译英文软件应运而生。这类软件能够将各种语言的文本迅速准确地翻译成英文&#xff0c;使我们…

深度学习--主动学习

主动学习简介 主动学习是指对需要标记的数据进行优先排序的过程&#xff0c;这样可以确定哪些数据对训练监督模型产生最大的影响。主动学习是一种学习算法可以交互式查询用户(teacher 或 oracle)&#xff0c;用真实标签标注新数据点的策略。主动学习的过程也被称为优化实验设计…

语音与语言处理技术交流会(深圳)

嘉宾介绍 嘉宾介绍&#xff1a;罗艺&#xff0c;2021年在美国哥伦比亚大学获得博士学位后加入腾讯AI Lab Shenzhen任高级研究员&#xff0c;研究方向主要为音频前端处理&#xff0c;包括但不限于音频分离、单/多通道语音增强等。 报告题目&#xff1a;腾讯AI Lab音频与语音前端…

【起飞】让你电脑速度快到飞起的一些牛逼的设置整理【电脑卡顿反应慢等问题解决】

对于开发来说电脑的反应速度简直影响了思维的速度&#xff0c;要让电脑速度跟上我们的思维&#xff0c;提高工作效率&#xff0c;早点打卡下班回家陪老婆孩子哈哈 这篇文章主要对windows系统做的一些优化&#xff0c;是真的好用&#xff0c;仿佛在访问静态页面一样&#xff0c;…

Java进阶-常用的API

1 Math类 1.1 概述 tips&#xff1a;了解内容 查看API文档&#xff0c;我们可以看到API文档中关于Math类的定义如下&#xff1a; Math类所在包为java.lang包&#xff0c;因此在使用的时候不需要进行导包。并且Math类被final修饰了&#xff0c;因此该类是不能被继承的。 Math类…

指针穿梭,数据流转:探秘C语言实现单向不带头不循环链表

本篇博客会讲解链表的最简单的一种结构&#xff1a;单向不带头不循环链表&#xff0c;并使用C语言实现。 概述 链表是一种线性的数据结构&#xff0c;而本篇博客讲解的是链表中最简单的一种结构&#xff0c;它的一个结点的声明如下&#xff1a; // 单链表存储的数据类型 typ…