PclSharp--计算AABB包围盒体积2

一、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();
        }

    }
}

三、结果显示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2814533.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【HarmonyOS】鸿蒙开发之Video组件——第3.7章

Video组件内VideoOptions属性简介 src:设置视频地址。currentProgressRate:设置视频播放倍速,参数说明如下: number|string:只支持 0.75 , 1.0 , 1.25 , 1.75 , 2.0 。P…

IDEA利用鼠标调整字体大小

就可以按住ctrl和鼠标调节代码字体的大小啦! 如果有用,记得给我来个赞~ 谢啦!

Flutter中高级JSON处理:使用json_serializable进行深入定制

Flutter中高级JSON处理 使用json_serializable库进行深入定制 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/1363…

小红书母婴博主推广方式汇总,投放总结

母婴博主有区别于其他博主,她需要一定的行业知识,需要取得粉丝的一定信任,才能顺利传播进而一步一步成长。今天和大家分享下小红书母婴博主推广方式汇总,投放总结! 1、小红书母婴博主有哪些领域 母婴博主不同于育儿博主…

windows定时备份日志文件

前言 之前项目因为各种原因没有上 CI/CD,也没有部署什么 nginx 管理工具,再加上 nginx 部署在 windows server 上,面对日积月累不停膨胀的日志文件,需要一个定时脚本处理自动分割日志文件。 本篇文章主要讲解如何在 windows 上创…

28. 找出字符串中第一个匹配项的下标(力扣LeetCode)

文章目录 28. 找出字符串中第一个匹配项的下标题目描述暴力KMP算法 28. 找出字符串中第一个匹配项的下标 题目描述 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。…

【.NET Core】深入理解IO之File类

【.NET Core】深入理解IO之File类 文章目录 【.NET Core】深入理解IO之File类一、概述二、File类2.1 File.AppendAllLines方法2.2 File.AppendAllText方法2.3 File.Copy 方法2.4 File.Create 方法2.5 File.Decrypt(String) 方法2.6 File.Delete(String) 方法2.7 File.Move 方法…

Linux系统——Nginx拓展

目录 一、重写功能——rewrite 1.if 1.1 if 2. return 2.1状态码301和302的区别 301 302 3. set 4. break 5. rewrite 5.1 rewrite flag使用 5.2 flag说明 5.3举例 5.3.1访问 bj 跳转 beijing 5.3.2举例——break 5.3.3 http 转 https 5.3.4 break 与 last …

亿道信息新品EM-T195轻薄型工业平板,隆重登场!

EM-T195是一款轻巧但坚固的平板电脑,仅 650克重、10.5mm毫米厚,即使没有额外的便携配件进行辅助,您也可以轻松将其长时间随身携带。耐用性外壳完全密封,防尘防潮;出色的坚固性和可靠性,使T195天生适合在苛刻…

[Flutter]设置应用包名、名称、版本号、最低支持版本、Icon、启动页以及环境判断、平台判断和打包

一、设置应用包名 在Flutter开发中,修改应用程序的包名(也称作Application ID)涉及几个步骤,因为包名是在项目的Android和iOS平台代码中分别配置的。请按照以下步骤操作: 1.Android Flutter工程中全局搜索替换包名 …

安全防御-第六次

内容安全 攻击可能只是一个点,防御需要全方面进行 DFI和DPI技术--- 深度检测技术 DPI --- 深度包检测技术--- 主要针对完整的数据包(数据包分片,分段需要重组),之后对数据包的内容进行识别。(应用层&…

300分钟吃透分布式缓存-17讲:如何理解、选择并使用Redis的核心数据类型?

Redis 数据类型 首先,来看一下 Redis 的核心数据类型。Redis 有 8 种核心数据类型,分别是 : & string 字符串类型; & list 列表类型; & set 集合类型; & sorted set 有序集合类型&…

ABB 机械手设定IP地址

设定ABB机械手IP地址步骤如下: 打开示教器 控制面板 2.打开配置 3.点击IP Setting

Web服务器群集:OpenEuler 部署 LAMP(LNMP) 基础服务

目录 一、实验 1.环境 2. 网络配置 3. MobaXterm远程连接 4. apache 2.4.58 源码编译安装 5. php 8.3.1源码编译安装 6.配置httpd 连接 php-fpm 6. nginx 1.24.0源码编译安装 7. mysql 8.0.36安装 二、问题 1.MobaXterm设置右键复制粘贴 2.OpenEuler如何查看CPU的核…

SQL注入漏洞解析-less-8(布尔盲注)

我们来看一下第八关 当我们进行尝试时,他只有You are in...........或者没有显示。 他只有对和错显示,那我们只能用对或者错误来猜他这个数据库 ?id1%27%20and%20ascii(substr(database(),1,1))>114-- ?id1%27%20and%20ascii(substr(database(),1,…

防火墙的内容安全

目录 1. 内容安全 1.1 IAE引擎 DPI---深度包检测技术 DFI---深度流检测技术 结论(优缺点): 1.2 入侵防御(检测)(IPS) IPS的优势: 入侵检测的方法: 入侵检测的流程 签名 查看预定义签名的内容 新建自定义签名 入侵防御的检测…

什么时候要用到Reflect API?

参考文档 https://www.zhihu.com/question/460133198 https://cn.vuejs.org/guide/extras/reactivity-in-depth.html https://juejin.cn/post/7103764386220769311 Reflect API 一般搭配 Proxy API 一起使用。什么是 Proxy API 呢? 先回顾下 vue 的数据响应性是如何…

没有货币化,郎酒也能用大营销让经销商赚到钱?

文|琥珀食酒社 作者 | 五画 一年卖一千亿,这是郎酒在去年9月8日定下的目标。 当时正值第三届郎酒庄园会员节之际,郎酒集团董事长汪俊林从使命、愿景、价值观等十二个方面发布“百年郎酒”总纲领。 为郎酒立下新的“351”工程发展目标&…

HarmonyOS—使用数据模型和连接器

Serverless低代码开发平台是一个可视化的平台, 打通了HarmonyOS云侧与端侧能力,能够轻松实现HMS Core、AGC Serverless能力调用。其中,数据模型和连接器是两大主要元素。开发者在使用DevEco Studio的低代码功能进行开发时,可以使用…

行为树入门:BehaviorTree.CPP Groot2练习(叶子节点)(2)

以《行为树BehaviorTree学习记录1_基本概念》练习。 1 SequenceNode顺序控制节点 代码下载 git clone https://gitee.com/Luweizhiyuan2020/ros2_bt.git例程 1.1 sequence 顺序执行 下载版本SequenceNode1。 1.2 ReactiveSequence 异步执行 注意: ①only a…