点云特征介绍
点云的法向量是指在点云数据中的每个点处,与该点相关联的法向方向。法向量通常用于表示点云中点的朝向或表面的法向信息。在点云中,法向量可以用来描述点云表面的法向特性,例如点云表面的平面、曲率和法向变化等。
点云的法向量通常是一个3维向量,表示点在三个坐标轴方向上的法向分量,即(x, y, z)
方向上的法向量分量。通常情况下,点云法向量的长度(模)为1,表示法向量的单位长度。法向量的方向指向了点云表面的外侧。点云的法向量可以通过多种方法计算得到,例如最近邻搜索、曲率计算、法向估计算法等。计算得到的法向量可以在许多点云处理任务中发挥重要作用,例如点云分割、物体识别、表面重建等。
点云数据通常以文本文件(例如.txt文件)的形式保存,每行包含一组数字,这些数字代表了点云中的不同属性。通常,每个数字在点云数据中对应于以下一些属性:
三维坐标:点云数据中的点通常由三维坐标表示,分别表示点在X、Y、Z轴上的位置。
法向量:点云数据中的法向量通常表示点的法向信息,用于表示点云表面的朝向或法线方向。
颜色信息:点云数据中的颜色信息通常表示点的RGB或RGBA颜色值,用于表示点的颜色。
反射强度:点云数据中的反射强度通常表示从点云返回的激光反射信号的强度,用于表示点的反射属性。
附加属性:点云数据中可能包含其他附加属性,如曲率、法向量的置信度、分类标签等,根据具体的应用需求。
1 CloudCompare实现添加法向量
- 通过菜单栏的编辑> 法向量> 计算找到该功能。
2 设置相关参数:
如果进行计算的实体对象是点云,那么需要设置以下几个参数:
-
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方法对法线字段进行全局反转。
2.点云法线计算结果
法线实体的外观变化取决于光线相对于法线的方向:
对于点云来说,法线向后的点呈现黑色。
保存成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:三角形法线被分配到三角形-硬/镶嵌外观,但保留锋利的边缘