CloudCompare——计算点云的法向量

目录

  • 1.Computing normals on a cloud
  • 2.点云法线计算结果
  • 3.反转法线方向(Normals > Invert)
  • 4. With Minimum Spanning Tree
  • 5.With Fast Marching
  • 6.HSV colors
  • 7.Dip and Dip direction SFs
  • 8.Clear
  • 9.Computing normals on a mesh
  • 9.相关链接

1.Computing normals on a cloud

  通过菜单栏的'Edit > Normals > Compute'找到该功能。
CloudCompare——计算点云的法向量_第1张图片
设置相关参数
CloudCompare——计算点云的法向量_第2张图片

  如果进行计算的实体对象是点云,那么需要设置以下几个参数:

  • local surface model:选择使用最小二乘拟合平面、二次曲面拟合或三角网。
  • Neighbors->Octree->radius:局部球体邻域的半径。如果设置的太小(即没有足够的点来计算局部模型),那么法线值将默认为(0,0,1)。如果设置的太大,计算的过程可能会很长,结果会很平滑。
  • Orientation:让用户指定一个简单的启发式来设置法线方向(最好是在表面之外)。
  • Orientation->Use preferred orientation :使用如下方式设置点云法线的朝向(+Z与Z轴正方向同向)
    CloudCompare——计算点云的法向量_第3张图片
  • Orientation->Use minimum Spanning Tree :使用最小代价生成树调整点云法线的朝向

注意:

  • 如果没有指定首选方向,或者结果仍然不一致,可能需要使用更高级的算法——‘Normals > Orient Normals > With Minimum Spanning Tree’,来确定法线的方向。
    CloudCompare——计算点云的法向量_第4张图片

  • 在任何情况下,都可能需要使用invert方法对法线字段进行全局反转。
    CloudCompare——计算点云的法向量_第5张图片

2.点云法线计算结果

  法线实体的外观变化取决于光线相对于法线的方向:

  • 对于点云来说,法线向后的点呈现黑色。
    CloudCompare——计算点云的法向量_第6张图片
      保存成txt格式,打开则可以看到在原来XYZ坐标后边多了法向量的值。
    CloudCompare——计算点云的法向量_第7张图片
      保存成pcd格式,使用PCL进行法向量可视化。
#include 
#include 
#include 
#include 

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;
}

CloudCompare——计算点云的法向量_第8张图片

3.反转法线方向(Normals > Invert)

  该工具用来反转所选实体的法线。可以通过Edit > Normals > Invert菜单访问。
法线实体的外观变化取决于光线相对于法线的方向:

  • 对于点云来说,法线向后的点呈现黑色。
  • 对于一个网格(使用默认材质),后向发光的三角形出现在浅蓝色(而前向发光的三角形是绿色)

反转点云的法线方向
CloudCompare——计算点云的法向量_第9张图片
使用PCL可视化
CloudCompare——计算点云的法向量_第10张图片

4. With Minimum Spanning Tree

  这个工具可以通过'Edit > Normals > Orient normals > with Minimum Spanning Tree'菜单访问。
这种方法试图以一致的方式重新定位云的所有法线。它从一个随机的点开始,然后从一个邻居传播到另一个。传播是在最小生成树的帮助下完成的。因此,用户必须指定每个节点上连接的邻居的最大数量(邻居越多,就越准确,但也需要更多的内存和更多的时间)。
使用最小代价生成树调整的结果
CloudCompare——计算点云的法向量_第11张图片

5.With Fast Marching

  这个工具可以通过Edit > Normals > Orient normals > with Fast Marching菜单访问。这种方法试图以一致的方式重新定位云的所有法线。它从一个随机的点开始,然后从一个邻居传播到另一个。传播是通过应用于网格的Fast Marching算法完成的。实际上,这个网格是点云的八叉树,被认为是一个给定的细分级别。因此,用户必须指定此细分级别。问题是找到正确的水平:如果体素分辨率太大(即低水平的细分),传播不是很准确。然而,如果体素分辨率太小(即高水平的细分),可能出现空体素,传播在一次扫描中完成是不可能。
注意:这种方法很快,效率极高。但是不推荐用。

6.HSV colors

  这个工具可以通过Edit > Normals > Convert to > HSV colors菜单访问。用来将点云的法线转换为HSV颜色字段。

H = dip direction, S = dip , V = 1

CloudCompare——计算点云的法向量_第12张图片

7.Dip and Dip direction SFs

  这个工具可以通过Edit > Normals > Convert to > Dip and dip direction SFs菜单访问。
将云的法线转换为两个标量字段:

  • 一个有倾角值
  • 另一个带倾角方向值

注意:角度是以度为单位的。
CloudCompare——计算点云的法向量_第13张图片

8.Clear

  这个工具可以通过Edit > Colors > Clear访问。从选定的实体中移除法线。

9.Computing normals on a mesh

CloudCompare——计算点云的法向量_第14张图片

  • per-vertex:连接到一个顶点的所有三角形的平均法线被分配到这个顶点-光滑的外观,没有保留尖锐的边
  • per triangle:三角形法线被分配到三角形-硬/镶嵌外观,但保留锋利的边缘
    CloudCompare——计算点云的法向量_第15张图片

9.相关链接

[1] PCL 计算点云法向量并显示
[2] PCL 之vtk计算点云模型的法向量

你可能感兴趣的:(CloudCompare,c++)