1、CropHull滤波器可以得到2D封闭多边形内部或者外部的点云。
2、代码:
using PclSharp;
using PclSharp.Filters;
using PclSharp.IO;
using PclSharp.Std;
using PclSharp.Struct;
using PclSharp.Surface;
using System;
namespace PclSharpTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine($"C#--PclSharp算法库测试:");
//读取2D兔子点云对象
var src_cloud = new PointCloudOfXYZ();
using (var reader = new PCDReader())
reader.Read(AppDomain.CurrentDomain.BaseDirectory + $"//pcd//rabbit2D.pcd", src_cloud);
//构造2D封闭多边形
var boundingbox = new PointCloudOfXYZ();
boundingbox.Add(new PointXYZ { X = -2.8f, Y = 1.3f, Z = 0 });
boundingbox.Add(new PointXYZ { X = 0.2f, Y = 1.8f, Z = 0 });
boundingbox.Add(new PointXYZ { X = 3.2f, Y = 0.9f, Z = 0 });
boundingbox.Add(new PointXYZ { X = 0.8f, Y = -0.5f, Z = 0 });
boundingbox.Add(new PointXYZ { X = -1.8f, Y = 0.3f, Z = 0 });
boundingbox.Width = 5;
boundingbox.Height = 1;
//对输入的2D平面点构造2D凸包,凸包的构造需要使用ConvexHull类
//创建凸包对象
ConvexHullOfXYZ hull = new ConvexHullOfXYZ();
//设置输入点云
hull.SetInputCloud(boundingbox);
//设置凸包维度
hull.Dimension = 2;
//设置Vertices类型的量,用于保存凸包顶点
VectorOfVertices polygons =new VectorOfVertices();
该点云用于描述凸包形状
var surface_hull = new PointCloudOfXYZ();
计算2D凸包结果
hull.Reconstruct(surface_hull, polygons);
var objects = new PointCloudOfXYZ();
CropHullOfXYZ bb_filter = new CropHullOfXYZ();
bb_filter.SetDim(2);
bb_filter.SetInputCloud(src_cloud);
bb_filter.SetHullIndices(polygons);
bb_filter.SetHullCloud(surface_hull);
bb_filter.filter(objects);
Console.WriteLine($"Cloud after crop has:{objects.Count} data points.");
using (var visualizer = new PclSharp.Vis.Visualizer(" visual window"))
{
//创建三个观察视点
int v1 = 1;
int v2 = 2;
int v3 = 3;
visualizer.CreateViewPort(0.0, 0.0, 0.33, 1.0, v1);
visualizer.CreateViewPort(0.33, 0.0, 0.66, 1.0, v2);
visualizer.CreateViewPort(0.66, 0.0, 1.0, 1.0, v3);
//设置背景色
visualizer.SetBackgroundColor_ViewPort(0f, 0f, 0f, v1);
visualizer.SetBackgroundColor_ViewPort(0f, 0f, 0f, v2);
visualizer.SetBackgroundColor_ViewPort(0f, 0f, 0f, v3);
//添加点云
visualizer.AddPointCloud(src_cloud, "v1", v1);
visualizer.AddPointCloud(objects, "v2", v2);
visualizer.AddPointCloud(surface_hull, "v3", v3);
visualizer.SetPointCloudColor(1, 1, 0.5, "v1");//点云附色
visualizer.SetPointCloudColor(1, 0.5, 1, "v2");//点云附色
visualizer.SetPointCloudColor(1, 1, 0.5, "v3");//点云附色
visualizer.SetPointCloudRenderingProperties(PclSharp.Vis.RenderingProperties.PointSize, 8, "v3", v3);
while (!visualizer.WasStopped)
visualizer.SpinOnce(100);
}
Console.ReadKey();
}
}
}
3、编译结果: