PclSharp1.12.0--计算AABB包围盒体积2

一、AABB包围盒

AABB包围盒即轴对齐包围盒,就是包围盒对齐坐标轴。计算相对简单,在要求不精细的情况下,这种包围盒是够用的。

MomentOfInertiaEstimation 是 PCL中的一个类,用于计算点云中物体的矩。它可以提供点云物体的三个主轴及其长度,以及物体的惯性矩阵等信息。通过使用 MomentOfInertiaEstimation 类,计算AABB包围盒。

二、代码

注:测试代码均使用PclSharp1.12.0库

using PclSharp;
using PclSharp.Eigen;
using PclSharp.Features;
using PclSharp.Helpers;
using PclSharp.IO;
using PclSharp.Search;
using PclSharp.Std;
using PclSharp.Struct;
using PclSharp.Surface;
using PclSharp.Vis;
using System;
using System.Numerics;

namespace PclSharpTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine($"C#--PclSharp算法库测试:");

            //读取点云数据
            var cloud_current = new PointCloudOfXYZ();
            using (var reader = new PCDReader())
            reader.Read(AppDomain.CurrentDomain.BaseDirectory + $"//pcd//rabbit.pcd", cloud_current);
            //降采样
            PointCloudOfXYZ cloudFiltered = new PointCloudOfXYZ();//滤波后的点云
            using (var sor = new PclSharp.Filters.VoxelGridOfXYZ())
            {
                sor.SetInputCloud(cloud_current);
                sor.LeafSize = new PointXYZ { X = 2.0f, Y = 2.0f, Z = 2.0f };//体素点的大小
                sor.filter(cloudFiltered);
            }
            cloud_current = cloudFiltered;
            Vector3f mass_center = new Vector3f();
            PointXYZ minpt = new PointXYZ();
            PointXYZ maxpt = new PointXYZ();
            using (MomentOfInertiaEstimationOfXYZ feature_extractor = new MomentOfInertiaEstimationOfXYZ())
            {
                feature_extractor.SetInputCloud(cloud_current);
                feature_extractor.Compute();

                VectorOfFloat moment_of_inertia = new VectorOfFloat();
                VectorOfFloat eccentricity = new VectorOfFloat();
                float major_value = 0, middle_value = 0, minor_value = 0;
                Vector3f major_vector = new Vector3f();
                Vector3f middle_vector = new Vector3f();
                Vector3f minor_vector = new Vector3f();
                // 获取惯性矩
                feature_extractor.getMomentOfInertia(moment_of_inertia);
                // 获取离心率
                feature_extractor.getEccentricity(eccentricity);
                // 获取AABB盒子
                feature_extractor.getAABB(ref minpt, ref maxpt);

                feature_extractor.getEigenValues(ref major_value, ref middle_value, ref minor_value);
                // 获取主轴major_vector,中轴middle_vector,辅助轴minor_vector
                feature_extractor.getEigenVectors(major_vector, middle_vector, minor_vector);
                // 获取质心
                feature_extractor.getMassCenter(mass_center);
               }

               using (var visualizer = new PclSharp.Vis.Visualizer("a window"))
               {

                visualizer.RemoveAllPointClouds();
                visualizer.SetBackgroundColor(0.3f, 0.3f, 0.3f);
                //visualizer.AddPointCloud(pointCloud);
                visualizer.AddPointCloudColor(cloud_current, "z");
                //设置点的大小
                visualizer.SetPointCloudRenderingProperties(RenderingProperties.PointSize, 2);
                visualizer.AddCoordinateSystem(1.0);

                /***************添加AABB包围盒******************/
                
                //包围盒体积
                float xVolume = (maxpt.X - minpt.X) * (maxpt.Y - minpt.Y) * (maxpt.Z - minpt.Z);
                Console.WriteLine($"包围盒体积:{xVolume}");
                //添加AABB包容盒
                visualizer.AddCube(minpt, maxpt, 1, 1, 0, "AABB");
                visualizer.SetShapeRenderingProperties(RenderingProperties.representation, RenderingRepresentationProperties.PCL_VISUALIZER_REPRESENTATION_WIREFRAME, "AABB");
                //添加文字标签
                PointXYZ p1 = new PointXYZ() { X = minpt.X, Y = minpt.Y, Z = minpt.Z };
                visualizer.AddText3D($"({p1.X},{p1.Y},{p1.Z})", p1, 0.3, 1.0, 0, 0);

                while (!visualizer.WasStopped)
                    visualizer.SpinOnce(100);
            }

            Console.ReadKey();
        }

    }
}

三、结果显示

  • 22
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

西~风

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

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

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

打赏作者

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

抵扣说明:

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

余额充值