点云法线

原文链接

点云法线定义

对于一个三维空间的正则曲面R(u, v), 点(u, v)处的切平面(Ru, Rv)的法向量即为曲面在点(u, v)的法向量。点云是曲面的一个点采样,采样曲面的法向量就是点云的法向量。

我们给每个点一个线段来显示法线,线段的方向为法线方向,如下图所示。这种显示方法虽然简单,但是不方便查看法线的正确性。下面介绍的点云渲染,能更加直观的查看法线的正确性。


点云法线应用

  • 点云渲染:法线信息可用于光照渲染。如下图所示,左边的点云为纯颜色渲染,右图是Phone光照模型的渲染效果,它是真实光照模型的一个近似。它模拟的是漫反射光照,漫反射光照符合Lambert余弦定律,即漫反射光强与N * L成正比,N为法线方向,L为点到光源的向量。所以,在模型边缘处,N与L近似垂直,着色会比较暗。

点云渲染也可以用来检查法线的正确性。如下图所示,光源在模型的正前方,左边的渲染图看起来更加符合我们的直观感觉,右图的渲染方式看起来有些不对,是因为法线不准导致的。通过点云的渲染,可以快速定性的检查法线是否正确。至于右图为什么看起来不对,这个就是一个直观感觉,正确的渲染图看多了,就会有感觉了。

  • 点云重建:对于一个封闭曲面,我们可以在空间中定义一个函数形状Indicator := 曲面内部为1,曲面外部为0。则这个形状函数的梯度只有在曲面上不为0,这个梯度方向就是曲面的法线方向。我们可以应用法线信息,来计算这个形状函数。有了形状函数,就可以通过提取等值面的方法来提取这个点云的形状曲面。

  • 区分薄板正反面:有时候扫描很薄的板子,板子正反面的扫描点距离很近,有些扫描仪精度低,就更使得正反面的点混在一起,如下图所示,蓝色和绿色的点分别代表了正反面的扫描点。这时候法线能很好的区分正反面。法线的定向应该在扫描时就做好,如果后期来整体定向,薄板正反面的点法线就区分不开了。

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


点云法线计算

点云采样于物体表面,物体表面的法线即为点云法线,故可先对物体表面的几何进行估计,即可计算出点云法线。一般可用低阶多项式曲面进行局部拟合,如左图所示。如果点云均匀分布,希望计算速度快,也可以用平面进行局部拟合,平面法线即为点云法线,如右图所示。

平面的局部拟合,可以采用PCA(主成分分析)的方法。因为曲面局部是平坦的,法线所在的方向是主成分最低的方向,也就是PCA里面最小特征值对应的特征方向。具体操作如下:1)给每个点计算K邻近邻域(也可以用半径邻域);2)计算PCA的协方差矩阵 Cov = ∑ (Ni – C) X (Ni – C),其中Ni为邻域点,C为中心点。这个协方差矩阵的最小特征值对应的特征向量即为这个点的法线方向。

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


点云法线定向

点云法线经过上面介绍的PCA计算以后,还有一个问题是全局定向。法线有两个互为相反的方向。所谓全局定向,就是视觉上连续的一片点云法线方向要一致,片于片之间的定向也要视觉一致。如下图所示,左图的法线定向是乱的,而右图的法线有一致的定向。对于任给的一个点云,想要完全正确的定向,是不可能的,因为信息的缺失,有些局部上的正确定向是不可能的。但是,也有一些启发式的方法来给点云法线定向,一般情况下是可以正确有效的定向的。

下面介绍一种简单的方法,它是图形学学者Hugues Hoppe在1992年发表的一篇Siggraph论文提到的方法。Hugues Hoppe目前是Google研究院的一名学者,他之前微软研究院工作,毕业于华盛顿大学。早期发表了很多关于曲面重建和网格优化的论文。

如果点云分布比较均匀,在光滑的地方,相邻两个点法线的夹角会很小,可以认为近似平行,即|Ni * Nj| ≈ 1,如果定向一致,则Ni * Nj ≈ 1。一个经典的定向方法是,给点云的每个点找k个最近点,并连上k条边,这样点云就变成一个图结构了,也叫Riemannian图。然后给每条边一个权重w = 1 - |Ni * Nj|。w越小,表明两点之间的法线越接近。然后从某一点出发,找出这个图的最小支撑树(Prim算法和Kruskal算法),并使得相邻点的定向一致。

这个定向方法在不光滑的地方,距离很近的薄板等情况下,可能会出问题。另外,如果点云有多个片区,虽然每个片区内部可以定向一致,但是片区之间的整体定向也是很难确定的。有不少论文针对这些情况设计了新的定向方法,但是新方法的条件假设也更多了。从全局效果来讲,不如这个方法的适普性好。因为算法假设越少,适普性也就越好。


扫描数据的完美定向

扫描数据是可以完美定向的。因为扫描得到的深度点云,法线与相机方向(Z轴)的夹角小于90度。由于法线有两个互为相反的方向,取与相机方向夹角小于90度的方向(向量点积大于0)。点云做了刚体变换(Matrix4x4::TransformPoint)后,点云法线也要做相应的变换(Matrix4x4::RotateVector,注意坐标点和向量的刚体变换是有区别的)。法线只有在最初的相机坐标系下是可以完美定向的。之后一旦做了刚体变换,想要再去全局定向,就只能采用之前介绍的“法线如何定向”的方法。这些全局定向的方法,都不能做到一定正确,它只能保证每个点云小片的定向一致,片之间的定向一致是没法保证的。

有兴趣的读者,欢迎参考视频版本

原文地址:https://www.cnblogs.com/threepark/p/11724040.html

时间: 2024-11-02 18:58:23

点云法线的相关文章

《PCL点云库学习&VS2010(X64)》Part 8 PCL1.72(VTK6.2.0)可视化例程

Part 8 PCL1.72(VTK6.2.0)可视化例程                                                                                                PCL1.72 VTK6.20 控制台程序 加入.props属性表文件 1.Cloud_Viewer Cloud_Viewer.cpp代码: #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRendering

一种网格点云快速法线估计方法

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 估计法线 int TopographyMesh::normalEstimation( std::vector<PointType>& in_points, std::vector<PCTTM_Triangle

PCL—低层次视觉—点云分割(超体聚类)

1.超体聚类——一种来自图像的分割方法 超体(supervoxel)是一种集合,集合的元素是“体”.与体素滤波器中的体类似,其本质是一个个的小方块.与之前提到的所有分割手段不同,超体聚类的目的并不是分割出某种特定物体,其对点云实施过分割(over segmentation),将场景点云化成很多小块,并研究每个小块之间的关系.这种将更小单元合并的分割思路已经出现了有些年份了,在图像分割中,像素聚类形成超像素,以超像素关系来理解图像已经广为研究.本质上这种方法是对局部的一种总结,纹理,材质,颜色类似

点云数据处理学习笔记

三维计算视觉研究内容包括: 三维匹配 多视图三维重建 SLAM 目标识别 形状检测与分类 语义分类 立体视觉与立体匹配 ZNCC SFM 1.点云滤波方法(数据预处理): 双边滤波.高斯滤波.条件滤波.直通滤波.随机采样一致性滤波. VoxelGrid 2.关键点 ISS3D.Harris3D.NARF SIFT3D. 3.特征和特征描述 法线和曲率计算  NormalEstimation .特征值分析Eigen-Analysis.EGI PFH.FPFH.3D Shape Context.Sp

点云拼接算法

1.粗配准拼接 #include <pcl/common/transforms.h> #include <pcl/console/parse.h> #include <pcl/console/time.h> #include <pcl/point_types.h> #include <pcl/io/pcd_io.h> #include <pcl/sample_consensus/method_types.h> #include <

PCL—点云分割(最小割算法)

1.点云分割的精度 在之前的两个章节里介绍了基于采样一致的点云分割和基于临近搜索的点云分割算法.基于采样一致的点云分割算法显然是意识流的,它只能割出大概的点云(可能是杯子的一部分,但杯把儿肯定没分割出来).基于欧式算法的点云分割面对有牵连的点云就无力了(比如风筝和人,在不用三维形态学去掉中间的线之前,是无法分割风筝和人的).基于法线等信息的区域生长算法则对平面更有效,没法靠它来分割桌上的碗和杯子.也就是说,上述算法更关注能不能分割,除此之外,我们还需要一个方法来解决分割的"好不好"这个

3D打印云平台在线显示

随着3D打印的普及,让产品的高端个性化定制成为可能,也吸引越来越多用户参与进来.但是,3D打印云平台基本上还是以传统的统一设计.平面化展示.批量制造模式为用户提供服务.无法让普通用户亲身参与设计,将自己的思想在模型上表达出来. 华天软件提供3D打印云平台在线展示组件,可以快速实现模型的上传.修复.实时浏览.个性化编辑.体积估算等业务,用户可以自由地进行在线3D创意设计,为设计作品添加文字标识.个性化装饰.选择3D打印的材料.颜色.尺寸,同时自动计算3D打印模型的用料.体积和工时等生成报价. 缺陷

使用OSG显示点云时,如何正确将空白处屏幕坐标转为最接近点云的世界坐标

在OSG中绘制点云,实现画/测点.线等功能时,需要捕捉点云的坐标,但是要在空白区域绘制或测量时,就获取不到点云坐标了. 为了解决这个问题,自己推导出一个将点云空白处屏幕坐标转为最接近点云坐标的算法: 思路是:在每一次捕获真实点云时,即记录下当前点云坐标(lastCloudPoint):空白区域测点时,先将屏幕坐标转为虚拟的世界坐标,然后将坐标投影到 由 eye→center方向(eyeForward)作为法线且经过lastCloudPoint 的虚拟平面上,进而得到最靠近点云的坐标. 实际上,先

彩色点云生成mesh的纹理

上一篇文章 https://www.cnblogs.com/lovebay/p/11423576.html ,我们使用MPA算法实现了 点云生成mesh,但仅仅实现mesh的顶点着色,为了让mesh有更丰富更真实的纹理信息,这篇文章将实现密集的彩色点云为mesh生成高清的纹理,实现方法如下: 第一步:mesh的法线估计(正确的法向) 第二步:mesh批量分割(得到多个mesh小块),分割原则:同一个mesh小块,在某个方向的投影可见的. 第三步:将多个mesh小块批量生成高清纹理. 第四步:将多