1、基于移动最小二乘法(MLS)的平滑和法线估计
有时测量较小的对象时会产生一些误差,这些误差所造成的不规则数据如果直接拿来曲面重建的话,会使重建的曲面不光滑或者有漏洞。而且,这些不规则的缺陷很难用统计分析的方法进行消除,所以为了建立完整并且可用的点云模型,必须对表面进行平滑处理和漏洞修复。在不能进行额外扫描的情况下(也就是仅依靠已有数据的情况下),可以通过对数据进行重采样来解决这一个问题。重采样的算法通过对周围数据点进行高阶多项式的插值来重建表面缺少的部分。(主要功能是平滑表面,重建不光滑和漏洞,以便后边查找法向正常)
除此之外,多个扫描点的扫描结果配准后得到的数据直接拿来进行曲面重建会产生“双墙”等人造伪数据,即某快区域会出现重叠的两个曲面,使用重采样的方法同样可以处理这个问题。
2、代码:
using PclSharp;
using PclSharp.Common;
using PclSharp.Features;
using PclSharp.Filters;
using PclSharp.IO;
using PclSharp.SampleConsensus;
using PclSharp.Search;
using PclSharp.Segmentation;
using PclSharp.Std;
using PclSharp.Struct;
using PclSharp.Surface;
using System;
using System.Numerics;
namespace PclSharpTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine($"C#--PclSharp算法库测试:");
//读取点云数据
var cloud = new PointCloudOfXYZ();
using (var reader = new PCDReader())
reader.Read(AppDomain.CurrentDomain.BaseDirectory + $"//pcd//bun0.pcd", cloud);
var mls_points = new PointCloudOfPointNormal();
var tree = new KdTreeOfXYZ();
//定义最小二乘实现的对象mls
var mls = new MovingLeastSquaresOfPointXYZAndPointNormal();
mls.ComputeNormals=true; //设置是否计算法线
mls.SetInputCloud(cloud); //设置输入的点云
mls.SetSearchMethod(tree); //设置搜索方式
mls.SearchRadius=0.06; //设置搜索的半径
mls.Process(mls_points);//进行曲面重建
using (var viewer = new PclSharp.Vis.CloudViewer("Cloud Viewer"))
{
viewer.ShowCloud(cloud);
while (!viewer.WasStopped);
}
Console.ReadKey();
}
}
}
3、编译结果
以上例程输入的点云数据是pcl::PointXYZ格式的点云,而输出的是带有法向信息的pcl::PointNormal
效果如下(由于点云输入文件问题,处理后效果不是很明显,勉强能看到下面的点云相较于上面的点云,略微平顺)