PclSharp--CropHull任意多边形内部点云提取

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、编译结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西~风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值