一、AABB包围盒
AABB包围盒即轴对齐包围盒,就是包围盒对齐坐标轴。计算相对简单,在要求不精细的情况下,这种包围盒是够用的。
MomentOfInertiaEstimation 是 PCL中的一个类,用于计算点云中物体的矩。它可以提供点云物体的三个主轴及其长度,以及物体的惯性矩阵等信息。通过使用 MomentOfInertiaEstimation 类,计算AABB包围盒。
二、代码
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();
}
}
}
三、结果显示