本文由CSDN点云侠原创,首发于:2022年8月25日。博客长期更新,本文最新更新时间为:2025年1月11日。对最新论文阅读进行整理,添加法向量实现原理。
目录
1.实现原理
内容来自:论文截图。计算法向量的方法有几十种,这只是最常用的一种。
2.Computing normals on a cloud
通过菜单栏的'Edit > Normals > Compute'
找到该功能。
设置相关参数:
如果进行计算的实体对象是点云,那么需要设置以下几个参数:
local surface model
:选择使用最小二乘拟合平面、二次曲面拟合或三角网。Neighbors->Octree->radius
:局部球体邻域的半径。如果设置的太小(即没有足够的点来计算局部模型),那么法线值将默认为(0,0,1)。如果设置的太大,计算的过程可能会很长,结果会很平滑。Orientation
:让用户指定一个简单的启发式来设置法线方向(最好是在表面之外)。Orientation->Use preferred orientation
:使用如下方式设置点云法线的朝向(+Z与Z轴正方向同向)
Orientation->Use minimum Spanning Tree
:使用最小代价生成树调整点云法线的朝向
注意:
-
如果没有指定首选方向,或者结果仍然不一致,可能需要使用更高级的算法——
‘Normals > Orient Normals > With Minimum Spanning Tree’
,来确定法线的方向。
-
在任何情况下,都可能需要使用
invert
方法对法线字段进行全局反转。
3.点云法线计算结果
法线实体的外观变化取决于光线相对于法线的方向:
- 对于点云来说,法线向后的点呈现黑色。
保存成txt
格式,打开则可以看到在原来XYZ
坐标后边多了法向量的值。
保存成pcd
格式,使用PCL进行法向量可视化。
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>
using namespace std;
int
main(int argc, char** argv)
{
pcl::PointCloud<pcl::PointNormal>::Ptr cloud(new pcl::PointCloud<pcl::PointNormal>);
if (pcl::io::loadPCDFile<pcl::PointNormal>("bunny.pcd", *cloud) == -1)
{
PCL_ERROR("Could not read file\n");
}
//---------------------可视化(含法线)-----------------------------
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("CloudCompare-XYZNormal viewer"));
viewer->setWindowName("CloudCompare-XYZNormal");
viewer->addText("CloudCompare-PointNormal", 50, 50, 0, 1, 0, "v1_text");
viewer->addPointCloud<pcl::PointNormal>(cloud, "CloudCompare-XYZNormal");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 1, 0, "CloudCompare-XYZNormal");
viewer->addPointCloudNormals<pcl::PointNormal>(cloud, 20, 0.02, "normals");
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
return 0;
}
4.反转法线方向(Normals > Invert)
该工具用来反转所选实体的法线。可以通过Edit > Normals > Invert
菜单访问。
法线实体的外观变化取决于光线相对于法线的方向:
- 对于点云来说,法线向后的点呈现黑色。
- 对于一个网格(使用默认材质),后向发光的三角形出现在浅蓝色(而前向发光的三角形是绿色)
反转点云的法线方向
使用PCL可视化
5. With Minimum Spanning Tree
这个工具可以通过'Edit > Normals > Orient normals > with Minimum Spanning Tree'
菜单访问。
这种方法试图以一致的方式重新定位云的所有法线。它从一个随机的点开始,然后从一个邻居传播到另一个。传播是在最小生成树的帮助下完成的。因此,用户必须指定每个节点上连接的邻居的最大数量(邻居越多,就越准确,但也需要更多的内存和更多的时间)。
使用最小代价生成树调整的结果
6.With Fast Marching
这个工具可以通过Edit > Normals > Orient normals > with Fast Marching
菜单访问。这种方法试图以一致的方式重新定位云的所有法线。它从一个随机的点开始,然后从一个邻居传播到另一个。传播是通过应用于网格的Fast Marching
算法完成的。实际上,这个网格是点云的八叉树,被认为是一个给定的细分级别。因此,用户必须指定此细分级别。问题是找到正确的水平:如果体素分辨率太大(即低水平的细分),传播不是很准确。然而,如果体素分辨率太小(即高水平的细分),可能出现空体素,传播在一次扫描中完成是不可能。
注意:这种方法很快,效率极高。但是不推荐用。
7.HSV colors
这个工具可以通过Edit > Normals > Convert to > HSV colors
菜单访问。用来将点云的法线转换为HSV
颜色字段。
H = dip direction, S = dip , V = 1
8.Dip and Dip direction SFs
这个工具可以通过Edit > Normals > Convert to > Dip and dip direction SFs
菜单访问。
将云的法线转换为两个标量字段:
- 一个有倾角值
- 另一个带倾角方向值
注意:角度是以度为单位的。
9.Clear
这个工具可以通过Edit > Colors > Clear
访问。从选定的实体中移除法线。
10.Computing normals on a mesh
per-vertex
:连接到一个顶点的所有三角形的平均法线被分配到这个顶点-光滑的外观,没有保留尖锐的边per triangle
:三角形法线被分配到三角形-硬/镶嵌外观,但保留锋利的边缘
11.相关链接
[1] PCL 计算点云法向量并显示
[2] PCL 之vtk计算点云模型的法向量