点云法线估计原理

  • 一、理论基础
    • 1、为什么要求点云的法线
    • 2、如何估计法向量
  • 二、程序实现
  • 三、运行结果
  • 四、法线估计存在的问题

一、理论基础

1、为什么要求点云的法线

表面法线是几何体表面的重要属性,在很多领域都有大量应用,例如:在进行光照渲染时产生符合可视习惯的效果时需要表面法线信息才能正常进行,对于一个已知的几何体表面,根据垂直于点表面的矢量,因此推断表面某一点的法线方向通常比较简单。然而,由于我们获取的点云数据集在真实物体的表面表现为一组定点样本,这样就会有两种解决方法:

1)使用曲面重建技术,从获取的点云数据集中得到采样点对应的曲面,然后从曲面模型中计算表面法线;

2)直接从点云数据集中近似推断表面法线。

总的来说,就是点云的法线可以便是点云的特征,如果法向量连续,可以判断是平面,法向量突变,是角点。

本节将针对后一种情况进行讲解,已知一个点云数据集,在其中的每个点处直接近似计算表面法线。

2、如何估计法向量

对于物体表面一点,将它和领域的点云看成是空间的椭球体,法向量方向对应椭球体的最短轴方向。

思路:要求一个点的法线,对这个点的k近邻拟合平面,求这个平面的法线。将问题转换成一个最小二乘平面拟合问题。
1)平面方程
常规的平面方程如下,这个方程是过原点的

对于k个点,我们先求得这些点的重心,确保这个平面是过重心的,这个过程就是将数据去中心化:

2)最小二乘拟合,计算协方差矩阵
理想情况下所有点都通过这个平面,但实际是不可能的,因此利用最小二乘算法,使得误差最小。

3)对协方差矩阵A进行SVD分解,最小的特征向量即为法向量(理解:椭圆的最短轴方向)
另一种理解:A有三个特征值,对应三个特征向量,求得AX=0的解等价于求的最小的特征值minλ²,
故X表示最小特征值对应的特征向量。X即为上述的[a, b, c]T,即为法线。
第三种理解:平面上做特征值分解,其特征向量,大的表示主方向,稍微小的是另一个方向,第三个就是法线方向。

二、程序实现

#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/features/integral_image_normal.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/point_types.h>
#include <pcl/features/normal_3d.h>int main()
{//加载点云pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);pcl::io::loadPCDFile("E:/pcl_project/normal/normal/table_scene_lms400.pcd", *cloud);//估计法线pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;ne.setInputCloud(cloud);//创建一个空的kdtree对象,并把它传递给法线估计对象//基于给出的输入数据集,kdtree将被建立pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());ne.setSearchMethod(tree);//输出数据集pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>);//使用半径在查询点周围3厘米范围内的所有邻元素ne.setRadiusSearch(0.03);//计算特征值ne.compute(*cloud_normals);// cloud_normals->points.size ()应该与input cloud_downsampled->points.size ()有相同尺寸//法线可视化pcl::visualization::PCLVisualizer viewer("PCL Viewer");viewer.setBackgroundColor(0.0, 0.0, 0.0);viewer.addPointCloudNormals<pcl::PointXYZ, pcl::Normal>(cloud, cloud_normals);while (!viewer.wasStopped()){viewer.spinOnce();}return 0;
}

三、运行结果


四、法线估计存在的问题

1、怎么确定邻域?
邻域选择太大:法线估计比较平滑,但会受不相关物体的影响,比如要估计桌角的法向量,可能会把桌面的点也算进去
邻域选择太小:法线估计比较sharper,能估计比较精细的结构,但是受噪声的影响

2、解决方法
(1)带权重的法线估计,例如把反射强度,rgb等信息考虑进去

(2)先去噪
RANSAC去噪,滤波,降采样
(3)利用深度学习的方法

代码参考:PCL官网,点云库PCL从入门到精通
————————————————
版权声明:本文为CSDN博主「点云处理Zzz」的原创文章,遵循CC 4.0 BY - SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/adfjadsklf/article/details/115112474

点云法线估计:C++实现相关推荐

  1. PCL入门系列 —— NormalEstimation、NormalEstimationOMP 基于邻域的点云法线估计

    PCL入门系列 -- NormalEstimation.NormalEstimationOMP 基于邻域的点云法线估计 前言 程序说明 输出结果 代码示例 总结 前言 随着工业自动化.智能化的不断推进 ...

  2. AdaFit:一种对基于学习的点云法线估计方法的新思考(ICCV2021)

    AdaFit: Rethinking Learning-based Normal Estimation on Point Clouds (2021-ICCV) 代码地址:https://github. ...

  3. 【点云重采样Resampling】Python-pcl 基于多项式平滑点云及法线估计的曲面重建

    1. 点云重采样 基于多项式平滑点云及法线估计的曲面重建以实现重采样,可以使得点云数据更规整一些,没之前那么杂乱. set_Compute_Normals(True) 可以通过在最小二乘法中进行法线估 ...

  4. PCL:点云数据基于法线的边界提取(从最初的法线估计理论推导到最终的边界提取)

    该边界提取采用PCL库里边的方法,基于法线估计来实现的边界检测与提取: 首先从原始点云上计算出法线,再由法线结合数据估计出边界.(这样解释还是特别抽像吧) ------------法线求解:(平面的法 ...

  5. pcl点云特征提取 法线估计 PFH FPFH NARF 惯量偏心矩 RoPs特征 视点特征直方图VFH GASD特征

    pcl点云特征提取 法线估计 PFH FPFH NARF 惯量偏心矩  RoPs特征  视点特征直方图VFH GASD特征 博文末尾支持二维码赞赏哦 _ 如果要对一个三维点云进行描述,光有点云的位置是 ...

  6. 3D点云系列——pcl:点云平滑及法线估计

    通过重采样实现点云平滑 需要平滑的情况: 用RGB-D激光扫描仪等设备扫描物体,尤其是比较小的物体时,往往会有测量误差.这些误差所造成的不规则数据如果直接拿来曲面重建的话,会使得重建的曲面不光滑或者有 ...

  7. pcl里面的法线估计

    法线估计是一个很重要的特征,常常在被使用在很多计算机视觉的应用里面,比如可以用来推出光源的位置,通过阴影与其他视觉影响. 给一个几何表面,去推断给定点的法线方向,即垂直向量的方向往往是不容易的.然而, ...

  8. PCL之积分图法线估计

    积分图像是对有序点云的发现的估计的一种方法.该算法把点云作为一个深度图像,并创建一定的矩形区域来计算法线,考虑到相邻像素关系,而无需建立树形查询结构.因此,它是非常有效的. 代码展示: #includ ...

  9. OPEN3D(python)学习笔记-1.3 法线估计

    官方文档链接 http://www.open3d.org/docs/release/ 示例代码 先对点云进行下采样,然后用estimate_normals函数进行点云的法线估计,该函数查找相邻点并使用 ...

最新文章

  1. 大数据如何在商业银行战略规划中发挥作用
  2. ZooKeeper Dynamic Reconfiguration (dynamicConfigFile) ZooKeeper动态配置
  3. VB.NET通讯录源代码
  4. 将HTML转换为Apache POI的RichTextString
  5. 2. Get the codes from GIT
  6. 三星S10背板设计已确定:画面甚是感人
  7. Android实现语音识别代码
  8. Redis集群功能配置以及Redis Sentinel配置
  9. 新华三(H3C)校园招聘技术类笔试题2019
  10. 河南省谷歌高清卫星地图下载
  11. SIM868——AT+CBC 监测锂电池电量理解与测试
  12. 第22篇-安卓手机端抓包软件VNET介绍
  13. 安全模式解除android,安卓手机进入安全模式之后怎么解除
  14. java控制台五子棋工程_java控制台实现五子棋小游戏
  15. 什么是差模干扰、共摸干扰?
  16. 一网通支付ios开发
  17. 博通Brocade漏洞影响多家大厂的存储解决方案
  18. android锁屏时间大小,Android 4.4.4 锁屏界面时间大小修改
  19. cocos creator中FBX文件不可用显示asset invalid
  20. 阅读和了解什么是形式化方法?

热门文章

  1. 【iMessage苹果推信家庭推】位置推通过苹果实现iMessage群发的Apple script脚本代码如下: tell application “Messages” set csvDatator
  2. To Introduce An Anime
  3. ThinkPHP6.0 Session 问题
  4. linux载入pytorch的预训练模型时遇到_pickle.UnpicklingError: unpickling stack underflow
  5. flac格式歌曲如何转换成mp3格式,flac转mp3详细图文教程 1
  6. vue 使用echarts 进行简单封装统一使用
  7. JIRA部署破解和confluence整合
  8. 深信服网络挑战赛初赛_2019
  9. 台式计算机功率图片,【图片】台式机电源别随便买!教你如何选择合适功率的电脑电源!_电脑吧_百度贴吧...
  10. XGBoost之分位点算法