1、PCL中Segementation库提供了点云分割的基础数据结构和部分通用的分割算法,目前实现的算法主要是基于聚类分割思想和基于随机采样一致性的分割算法,这些算法适用于将由多个空间分布独立的区域组成的点云分割成格子独立的点云子集,或者提取出特定的模型的点云数据,以便后续处理。
创建随机采样一致性分割对象,设置模型类型和随机采样一致性方法类型,并设定“距离阈值”,距离与之决定了点被认为是局内点时必须满足的条件,距离与之表示点到估计模型的距离最大值。在本例中,使用RANSAC方法作为选择的鲁棒估计方法,距离阈值为0.01米,即只要点到z = 1平面距离小于该阈值的点作为内点看待,大于该阈值的则看作外点:
2、代码
using PclSharp;
using PclSharp.Common;
using PclSharp.SampleConsensus;
using PclSharp.Segmentation;
using System;
using System.Numerics;
namespace PclSharpTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine($"C#--PclSharp算法库测试:");
var inCloud = new PointCloudOfXYZ();
var finalCloud = new PointCloudOfXYZ();
//生成数据
Random random = new Random();
for (int i = 0; i < 15; i++)
{
float x = random.Next(-10, 10) / 10.0f;
float y = random.Next(-10, 10) / 10.0f;
float z = 1.0f;
//设置几个局外点
if (i == 1)
{
z = 2.0f;
}
if (i == 4)
{
z = -2.0f;
}
if (i == 6)
{
z = 6.0f;
}
inCloud.Add(new Vector3(x, y, z));
}
inCloud.Width = 15;//点云数目
inCloud.Height = 1;//设置无序点云
Console.WriteLine($"Point Cloud data: {inCloud.Count}points ");
for (int i = 0; i < inCloud.Count; i++)
{
Console.WriteLine($"{inCloud.Points[i].X},{inCloud.Points[i].Y},{inCloud.Points[i].Z} ");
}
var inliers = new PointIndices();
var coefficients = new ModelCoefficients();
//创建分割对象
var seg = new SACSegmentationOfXYZ();
seg.OptimizeCoefficients = true;
seg.ModelType = SACModel.Plane;//设置分割的是平面
seg.MethodType = SACMethod.RANSAC;
seg.DistanceThreshold = 0.01;// 需要调的参数,表示离平面多少距离范围内的点会被分到平面上,值越大越有可能将平面上别的物体错误划分到平面上。
seg.SetInputCloud(inCloud);
//分割,存储分割结果到点集合inliers及存储平面模型的系数coefficients
seg.Segment(inliers, coefficients);
//输出平面模型的系数 a,b,c
float a = coefficients.Values[0];
float b = coefficients.Values[1];
float c = coefficients.Values[2];
float d = coefficients.Values[3];
Console.WriteLine($"平面模型的系数:{a} {b} {c} {d}");
//输出平面内点集合的坐标
Console.WriteLine($"Model inliers: {inliers.Indices.Count}points ");
for (int i = 0; i < inliers.Indices.Count; i++)
{
int count = inliers.Indices[i];
Console.WriteLine($"{count}:{inCloud.Points[count].X},{inCloud.Points[count].Y},{inCloud.Points[count].Z} ");
}
Console.ReadKey();
}
}
}
3、编译结果: