PCL 点云的法向量

news2024/11/24 9:23:47

一,点的法向量

点云法线

        法向量的概念是很小的时候我们就已经说的,法向量是我们点云中一个非常重要的属性,诸如饿哦们常说的三维重建、点云分割,点云去噪 以及特种描述算法等。

  特性:

点云中每一点的法向量夹角和曲率值均不随着物体的运动而改变,具有刚体运动不变性

点云法向量得的应用: 

1、点云渲染:

法向量可以用于光照渲染,漫反射光照符合Lambert余弦定律,即漫反射光强与N * L成正比,N为法线方向,L为点到光源的向量。所以,在模型边缘处,N与L近似垂直,着色会比较暗。

 点云渲染可以检查法向量的正确性。

 2、点云重建:

对与一个封闭的曲面,我们可以在空间中定义一个函数形状Indicator := 曲面内部为1,曲面外部为0。则这个形状函数的梯度只有在曲面上不为0,这个梯度方向就是曲面的法线方向。

 3、区分薄板正反面:

 

4、 法线贴图

下面两个图是一个人脸网格的UV展开,属于平面网格。它们的区别在于法线信息,右图的法线继承了原始网格的法线,它使得平面网格也可以渲染出凹凸感。这个技巧常用于游戏场景的渲染,用低面片数的网格加上高质量的法线贴图信息,来增强模型的几何凹凸感。

二、法向量估计方法

一般可用低阶多项式曲面进行局部拟合。如果点云均匀分布,希望计算速度快,也可以用平面进行局部拟合,平面法线即为点云法线。

1.基于Delaunay三角分割法
       基于Delaunay三角分割法不适合有噪声的点云,无法很好的用于现场采集数据集中。

2.基于鲁棒统计学方法
      基于鲁棒统计学的方法从原理到计算都过于复杂,因此无法直接用在大规模的点云场景中。

3.基于局部表面拟合法
       该方法使用范围最为广泛,且适用于大规模的点云场景中,计算原理较为简单了,效率快。
 

原理介绍:

1、 对点云中的每个点找半径A规定领域范围或者直接选择最近的K个点组合成一个平面,法然后使用最小二乘法拟合一个局部的平面。平面方程ax+by+cz+d=0;

Matlab 最小二乘法 拟合平面_Σίσυφος1900的博客-CSDN博客_matlab最小二乘法拟合平面

因此我们对点云中的某个点拟合的过程表示为:

平面局部拟合我们在pcl 中采的是PCA( 主要成分分析):

 

2、PCA分析:

因为曲面局部是平坦的,法线所在的方向是主成分最低的方向,也就是PCA里面最小特征值对应的特征方向

寻求一个方向n使得所有邻域点在方向n上的投影点的分布最为集中,也是就意味着点在该方向上的投影的方差最小

 具体操作如下:

1)给每个点计算K邻近邻域(也可以用半径邻域);

2)计算PCA的协方差矩阵 Cov = ∑ (Ni – C) X (Ni – C),其中Ni为邻域点,C为中心点。这个协方差矩阵的最小特征值对应的特征向量即为这个点的法线方向。

 在特征比较尖锐的地方,如左图所示,法线计算容易被光滑掉。右图直线是物体真实的几何,可以比较红色法线方向的差别。特征点的法线,可以用迭代权重的方法来修正,如先用平面局部拟合,然后给局部的点计算权重,离平面越远的点权重越小,然后再用带权重的点局部拟合平面,如此迭代即可。

 

pca :  主成分分析(PCA)原理详解 - 知乎

点云法向量_o180o的博客-CSDN博客_点云法向量

 法向量的定向: 

PCL 计算点云法向量并显示_点云侠的博客-CSDN博客_pcl 法向量

若两个相邻的连个点p1 p2(假设这连个平面上的点平滑的切共面的),那么我们从上一步中计算得到的两个向量你n1  n2 也几乎是平行的,也就是说n1 n2 之间的夹角可能就是0,,若夹角为180度,那么这两个点种的器重一个向量需要翻转一下。

表面的曲率:

曲率的意义:

曲率越小表示这个有K个点组成的平面越平坦,也就是说k-1 个领域的起伏情况越小,反之,曲率越大,则表示领域的起伏越大

计算:

我们在用PCA的时候用协方差矩阵M对齐进行特征值的分解,计算得出M的每个特征值r1<r2<r3<...<r(k-2),那么这K个点平面的曲率就是: 

    曲率S=r1/(r1+r2+r3+....+r(k-2))

 三、PCL中的法向量

 1、pcl 中法向量的格式:

 /*brief A point structure representing normal coordinates and the surface curvature estimate. (SSE friendly)ingroup common*/

struct Normal : public _Normal
{
    inline Normal (const _Normal &p)
    {
     normal_x = p.normal_x; 
     normal_y = p.normal_y; 
     normal_z = p.normal_z;
     data_n[3] = 0.0f;
     curvature = p.curvature;
    }

    inline Normal ()
    {
     normal_x = normal_y = normal_z = data_n[3] = 0.0f;
     curvature = 0;
    }

    inline Normal (float n_x, float n_y, float n_z)
    {
     normal_x = n_x; normal_y = n_y; normal_z = n_z;
     curvature = 0;
     data_n[3] = 0.0f;
    }

    friend std::ostream& operator << (std::ostream& os, const Normal& p);
    EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};


          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>);
          tree->setInputCloud(m_currentCloud->makeShared());
          n.setInputCloud(m_currentCloud->makeShared());
          n.setSearchMethod(tree);
          n.setKSearch(p1);



         // 输出结果是 法向量的x y z坐标和表面的曲率,
          n.compute(*normals);

四、PCL计算点云并显示


 

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

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

相关文章

【即将开源】⽤于3D激光雷达SLAM闭环检测的词袋模型BoW3D

​以下内容来自从零开始机器人SLAM知识星球 每日更新内容 点击领取学习资料 → 机器人SLAM学习资料大礼包 #论文# BoW3D: Bag of Words for Real-time Loop Closing in 3D LiDAR SLAM 论文地址&#xff1a;https://arxiv.org/abs/2208.07473 作者单位&#xff1a;中国沈阳自动…

C++基础语法

cout输出 cin是键盘输入 //i input 输入 o output输出 stream流 输入输出流头文件&#xff08;类似stdio.h&#xff09; 2 #include <iostream> 3 4 //std(标准) 使用标准的命名空间using namespace std;//命名空间,此标识符作为此组群的名字 5 using namespace std; 6…

A*算法-Python实现

好久没有在CSDN上发文章了&#xff0c;快一年了吧。这两天重新登录了一下&#xff0c;不看不知道&#xff0c;一看吓一跳&#xff0c;没想到访问量快13万了。 之前写博客的时候&#xff0c;想着把一些有用的东西写下来&#xff0c;一方面是当做笔记了&#xff0c;免得以后忘记…

小程序数据请求的方式和注意事项

1.小程序中网络数据请求的限制 出于安全性方面的考虑&#xff0c;小程序官方对数据接口的请求做出了如下两个限制&#xff1a; ① 只能请求HTTPS类型的接口 ② 必须将接口的域名添加到信任列表中 2.配置request合法域名 假设要在自己的微信小程序中&#xff0c;希望请求某…

Mysql 索引基数与选择性

这篇文章主要介绍 MySQL 索引的 Cardinality 值&#xff08;基数&#xff09;以及索引的可选择性。 什么是索引&#xff1f; 先看一下 wiki 定义&#xff1a; 索引&#xff08;英语&#xff1a;Index&#xff09;&#xff0c;是一本书籍的重要组成部分&#xff0c;它把书中的…

微信小程序中基础入门

一、数据绑定 1.数据绑定的基本原则 ① 在data中定义数据&#xff08;在.js文件&#xff09; ② 在wxml中使用数据 2.Mustache语法的格式 把data中的数据绑定到页面中进行渲染&#xff0c;使用MUstache语法&#xff08;双大括号&#xff0c;可以理解为vue中的插值表达式&…

Redis——》数据类型:List(列表)

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 Redis——》数据类型&#xff1a;List&#xff08;列表&#xff09;一、简介…

Linux02——操作系统接口

一、前言 OS是软硬件之前的桥梁&#xff1a;操作系统管理硬件&#xff0c;最终以服务的形式提供给用户。如用户读取磁盘数据&#xff0c;OS设备管理将读出来的数据通过文件系统交给用户。OS管理员对CPU&#xff08;进程&#xff09;管理&#xff0c;对内存管理&#xff0c;对设…

PyCharm中鼠标悬停在函数上时显示函数和帮助

一、问题 1.1 鼠标放上去不显示文档的提示 鼠标放在随意一个函数上面不显示他的说明了 我也不知道是咋了 二、解决 2.1 首先我只记得有一个侧边栏叫document 经典的解决办法 2.2 在setting中查看这是干嘛的 很多东西都可以在setting中查看到具体的功能 还可以查看到从哪里能…

Redis高级篇——持久化

Redis持久化 1.RDB 1.1RDB简介 RDB全称Redis Database Backup file &#xff08;Redis数据备份文件&#xff09;&#xff0c;也被叫做Redis数据快照。把内存中的数据都记录到磁盘中&#xff0c;当Redis实例故障重启后&#xff0c;从磁盘中读取快照文件&#xff0c;恢复数据。…

蓝海创意云接受【看苏州】独家专访:助力苏州数字文化行业全方位发展

近日&#xff0c;由蓝海创意云提供渲染服务的动漫电影《老鹰抓小鸡》获金鸡奖最佳美术片提名&#xff0c;位列获奖名单的《长津湖》《独行月球》也由蓝海创意云渲染提供了后期服务。 就此&#xff0c;苏州广播电视总台旗下的苏州权威热点新闻和视频平台【看苏州】对蓝海彤翔执…

# Vue 中 JSON 编辑器使用

Vue 中 JSON 编辑器使用 文章目录Vue 中 JSON 编辑器使用背景描述vue-json-edit安装依赖测试页面效果图bin-code-editor安装依赖测试页面效果图CodeMirror安装依赖测试页面效果图vue-json-views安装依赖属性说明测试页面效果图vue-json-pretty安装依赖属性说明测试页面效果图码…

【CSS3】重点知识内容,快速上手

推荐前端学习路线如下&#xff1a; HTML、CSS、JavaScript、noodJS、组件库、JQuery、前端框架&#xff08;Vue、React&#xff09;、微信小程序和uniapp、TypeScript、webpack 和 vite、Vue 和 React 码源、NextJS、React Native、后端内容。。。。。。 层级选择器 a>b …

Kotlin高仿微信-第3篇-主页

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

Matlab图像处理基础(2):区域处理,边沿检测

目录 0. 概要 2. 卷积和相关 2.1 卷积 2.2 相关 2.3 卷积与相关的关系 2.4 Matlab函数 2.5 2-D卷积/相关的分解 3. 高通滤波&#xff0c;edge detection 3.1 matlab edge()函数 3.2 各种算子简介 3.2.1 Robert算子 3.2.2 Prewitt算子 3.2.3 Sobel算子 3.4 Cann…

维也纳国际酒店+丽柏酒店首个同物业双品牌项目成功加盟,中高端酒店品牌联动浮现新模式

从改革开放开启中国酒店市场化浪潮伊始&#xff0c;中国酒店市场一直处在高速发展的快车道。但四十年来&#xff0c;这条赛道上的竞争也出现了多次驱动引擎的动能转换。1996年起的20年里&#xff0c;庞大的经济型酒店切割了市场的主要蛋糕。而从2016年开始&#xff0c;中端酒店…

P2 Pytorch 张量数据类型

前言 1&#xff1a; 数据类型 2&#xff1a; 常用API 参考&#xff1a; 课时14 张量数据类型-1_哔哩哔哩_bilibili 一 数据类型 除了string ,相对于Numpy PyTorch 都能找到对应的数据类型 1.1 常用的Data type 常用的5种: IntTensor, LogTensor, ByteTensor, DoubleTensor,…

从迷之自信到逻辑自信(简版)

从2012年开始工作&#xff0c;10多年了&#xff1b; 从2002年开始奋斗&#xff0c;20多年了。 回首这20年&#xff0c;感觉自己的成绩很有限&#xff0c;相比过往的勤奋努力。 时代因素也有&#xff0c;个人智商等先天性制约也存在&#xff0c;但是呢&#xff0c;我就特别想…

ObjectARX的对象引用关系以及深克隆(deepClone)

目录1、对象引用概念1.1 概念1.2 所有权引用1.3 指针引用1.4 对象引用实现的例子2 关于深克隆(Deep Clone)2.1 深克隆基础2.2 clone() 和deepClone()2.3 关键概念2.3.1 克隆和存档2.3.2 克隆和所有权2.3.3 克隆和ID映射2.3.4 克隆和转换2.4 典型的deepClone操作1、对象引用概念…

第3讲 Android Camera Native Framework cameraserver.rc详解(上)

本讲是Android Camera Native Framework专题的第3讲&#xff0c;我们介绍cameraserver.rc详解&#xff08;上&#xff09;&#xff0c;包括如下内容&#xff1a; Android init语言简介cameraserver.rc详解 serviceuser选项group选项ioprio选项task_profiles选项rlimit选项 视频…