点云最小外包矩形计算

news2024/9/17 8:31:22

1、原理介绍

       一簇点云的最小外包矩形(Minimum Bounding Rectangle,MBR),是指用一个矩形将该簇点云框起来,所有点云数据在矩形框内。如下图所示为一个矩形框刚好将点云数据全部包围。

       下面给出一种基于最大重叠度的最小外包矩形,该方法依据任意相邻点计算得到多个矩形,选择轮廓点与该矩形重叠度最大的矩形作为最小外包矩形。具体步骤如下:

      (1)对点云进行边缘点提取,并对边缘点进行排序,得到有序边缘点;

     (2)对于每个轮廓点,选择与其相邻的下一个近邻点构成一条直线,以该直线与其垂直的直线确定最小外包矩形方向,计算得到一个最小外包矩形。

     (3)选择下一个轮廓点,重复步骤(2)即可得到下一个最小外包矩形。遍历所有的轮廓点即可得到一些列最小外包矩形。

    (4)由上述获取的最小外包矩形,计算边缘点到矩形四条边的距离,若到四条边的垂直距离均大于设定阈值,则为不重叠点,否则为重叠点。

        如下图中p点,计算其到四条边的距离示意图。

       任意相邻点确定的最小外包矩形,如下图所示。从中选择重叠度最大的外包矩形,即可得到理想的外包矩形。

 

 2、测试及结果

      根据上述原理,基于PCL、C++进行实现。提取的边缘点、所有轮廓线、最大重叠度矩形结果如下图所示。

部分计算代码如下:

//计算重叠度
double RateOverlapBoundarySides(vector<pcl::PointXYZ> boundarypoints, Rect onerectangle, double DsThres)
{

	LinePara Line1, Line2, Line3, Line4;
	Line1 = CalculateLine(onerectangle.leftbottom, onerectangle.leftup);
	Line2 = CalculateLine(onerectangle.leftup, onerectangle.rightup);
	Line3 = CalculateLine(onerectangle.rightup, onerectangle.rightbottom);
	Line4 = CalculateLine(onerectangle.leftbottom, onerectangle.rightbottom);

	vector<pcl::PointXYZ>inliers;//重叠点与非重叠点
	for (int i = 0; i < boundarypoints.size(); i++)
	{
		vector<double> Dsvec;
		Dsvec.push_back(Point2Dline(Line1, boundarypoints[i]));
		Dsvec.push_back(Point2Dline(Line2, boundarypoints[i]));
		Dsvec.push_back(Point2Dline(Line3, boundarypoints[i]));
		Dsvec.push_back(Point2Dline(Line4, boundarypoints[i]));
		//选择最小值
		double minds = getMin_vector(Dsvec);
		if (minds < DsThres)
		{
			inliers.push_back(boundarypoints[i]);
		}
	}
	double result = (float)inliers.size() / boundarypoints.size();
	return result;
}

//获取重叠度最大的矩形
// DsThres 距离阈值,确定该点是否为重叠点
Rect MaxOverlapBoundaryRec(vector<pcl::PointXYZ> boundarypoints, vector<Rect> onerectangle, double DsThres)
{
	
	vector<double> ratevec;//百分比
	for (int i = 0; i < onerectangle.size(); i++)
	{
		ratevec.push_back(RateOverlapBoundarySides(boundarypoints, onerectangle[i], DsThres));
	}

	double maxindex = GetIndexOfMax(ratevec);
	return onerectangle[maxindex];

}

该程序包括三个测试main函数,分别为测试边缘点检测、所有矩形可视化显示、最小外包矩形。结果如下:

  

  

 使用该cpp文件时,直接在配置好PCL环境的工程文件下,添加文件“最小外包矩形test”即可。

 

代码下载链接:https://download.csdn.net/download/qq_32867925/88024377

 

 

 

 

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

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

相关文章

[工业互联-19]:如何在QT中增加SOEM主站

目录 第1章 基本步骤 第2章 详细步骤 2.1.QT安装 2.2.VS安装 2.3.Win10 Debuggers 2.4.QT配置 2.5. SOEM移植 &#xff08;&#xff11;&#xff09;lib库生成 &#xff08;2&#xff09;文件移植: 文件整理 第1章 基本步骤 要在QT中添加SOEM主站功能&#xff0c;您需…

用OpenCV创建一张灰度黑色图像并设置某一列为白色

这段代码首先创建了一个400行600列的单通道灰度图像。然后,它遍历图像中的每个像素。如果像素位于列索引为30的列中,则将该像素的值设置为255。在灰度图像中,0表示黑色,255表示白色。因此,这段代码将图像的第30列设置为白色。 在 OpenCV 中,cv::Mat 构造函数的调用 cv::…

【算法 -- LeetCode】(13)罗马数字转整数

1、题目 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M …

哈希表和字符串专题1—205. 同构字符串 1002. 查找共用字符 925. 长按键入 844.比较含退格的字符串 C++实现

文章目录 205. 同构字符串1002. 查找共用字符925. 长按键入844.比较含退格的字符串栈模拟双指针 205. 同构字符串 class Solution { public:bool isIsomorphic(string s, string t) {unordered_map<char, char> map1;unordered_map<char, char> map2;for(int i0, j…

AI绘画:StableDiffusion炼丹Lora攻略-实战萌宠图片生成

Lora攻略-实战萌宠图片生成 写在前面的话一&#xff1a;准备二、Lora作用1.AI模特2.炼衣服Lora3.改变画风/画面背景Lora模型究竟是什么&#xff1f; 三、如何炼制自己的Lora模型&#xff1f;四、炼丹前的准备&#xff08;**下载整合包**&#xff09;五、选择合适的大模型六、高…

管理类联考——逻辑——记忆篇——数字编码——公式

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &#x1f495;兴趣爱好&#xff1a;b站天天刷&…

MySQL练习题(2)

创建如下员工标表 插入数据 1-- 按员工编号升序排列不在10号部门工作的员工信息 2-- 查询姓名第二个字母不是A且薪水大于1000元的员工信息&#xff0c;按薪水降序排列 4-- 求每个部门的平均薪水 5-- 求每个部门的最高薪水 6-- 求每个部门…

Coverity 2021.9 for win Coverity 2022.6 for linux

Coverity是一款快速、准确且高度可扩展的静态分析 (SAST) 解决方案&#xff0c;可帮助开发和安全团队在软件开发生命周期 (SDLC) 的早期解决安全和质量缺陷&#xff0c;跟踪和管理整个应用组合的风险&#xff0c;并确保符合安全和编码标准。Coverity 是一款精确的综合静态分析与…

JVM04-优化JVM内存分配以及内存持续上升问题和CPU过高问题排查

1-JVM内存分配 1.1-JVM内存分配性能问题 JVM内存分配不合理最直接的表现就是频繁的GC&#xff0c;这会导致上下文切换等性能问题&#xff0c;从而降低系统的吞吐量、增加系统的响应时间。因此&#xff0c;如果你在线上环境或性能测试时&#xff0c;发现频繁的GC&#xff0c;且…

密码学入门——分组密码模式

文章目录 参考书一、简介二、ECB模式三、CBC模式四、CFB模式五、OFB模式六、CTR模式 参考书 图解密码技术&#xff0c;第三版 一、简介 分组密码工作模式指的是将明文分成固定长度的块&#xff0c;并对每个块应用相同的加密算法进行加密的过程。这些块的长度通常是64位或128…

leetcode 654. 最大二叉树

2023.7.9 又是一道递归构造二叉树的题&#xff0c;和昨天做的那道题从中序与后序遍历序列构造二叉树类似&#xff0c;5分钟AC了。 大致思路就是通过找到数组中的最大值&#xff0c;并将其作为根节点&#xff0c;然后递归地构建左子树和右子树&#xff0c;最终返回整个最大二叉树…

PMP项目管理-敏捷

敏捷知识体系&#xff1a; 传统项目特点 1> 一开始就对详细的需求进行很高的投入 2> 价值只有到项目结束的时候才能体现, 风险较高 3> 一开始就要编写很多的文档 4> 客户参与度不高, 澄清完需求之后基本不参与 5> 需要花大量的时间来汇报当前的项目状态 6> 无…

Freertos-mini智能音箱项目---IO扩展芯片PCA9557

项目上用到的ESP32S3芯片引脚太少&#xff0c;选择了PCA9557扩展IO&#xff0c;通过一路i2c可以扩展出8个IO。这款芯片没有中断输入&#xff0c;所以更适合做扩展输出引脚用&#xff0c;内部寄存器也比较少&#xff0c;只有4个&#xff0c;使用起来很容易。 输入寄存器 输出寄存…

线程本地变量交换框架-TransmitterableThreadLocal(阿里开源)

上文 &#xff1a;秒级达百万高并发框架-Disruptor TransmitterableThreadLocal介绍 TransmitterableThreadLocal简称TTL 是阿里巴巴开源的一个框架。TransmittableThreadLocal是对Java中的ThreadLocal进行了增强和扩展。它旨在解决在线程池或异步任务调用链中&#xff0c;Thre…

MAC电脑查看SHA256方式

背景 现在很多网站下载大文件时&#xff0c;以往通过查看文件大小来确定是否下载正确&#xff0c;但是很多情况下&#xff0c;文件下载后大小差不多&#xff0c;但是很多时候却时候出现无法安装的问题&#xff0c;有可能还是下载的文件出现错误&#xff0c;导致文件无法正常使…

机器学习 day25(softmax在神经网络模型上的应用)

输出层采用softmax 在识别手写数字的模型中&#xff0c;预测y只有两个结果&#xff0c;所以输出层采用sigmoid激活函数且只有一个神经元。若预测y有10个结果&#xff08;0-9&#xff09;&#xff0c;该模型的前向传播计算方式与识别数字的模型完全相同&#xff0c;即隐藏层的…

dubbo概念及基本架构

一. Dubbo概念 1、Dubbo是一个开源的高性能&#xff0c;轻量级的Java RPC框架 RPC&#xff1a;远程服务调用 2、RPC的远程服务调用和SOA的服务治理两种功能。 二. Dubbo架构 0、服务提供方首先启动 1、服务提供方启动后&#xff0c;将其注射到注册中心里 2、消费者想调用提供…

线程随机性

目录 线程随机性的展现 执行start()的顺序不代表执行run()的顺序 在使用多线程技术时&#xff0c;代码运行的结果与代码执行顺序或者调用顺序无关。线程是一个子任务&#xff0c;而CPU是以不确定的方式&#xff0c;或者说是以随机的时间来调用线程中的run方法的。所以说线程执…

nvm 下载nodejs 失败

解决办法&#xff1a; 1.查看nvm安装路径 nvm root2、在安装路径下找到setting.txt,添加两句话 node_mirror: http://npm.taobao.org/mirrors/node/ npm_mirror: https://npm.taobao.org/mirrors/npm/3.再执行nvm install 就可以了。

【uniapp开发小程序】实现读取手机剪切板第一条,识别并以姓名/手机号/收货地址格式输出

效果图&#xff1a; 完整代码&#xff1a; <template><view class""><text>测试</text><view click"pasteContent()" class"content">点击此处可快速识别 您的收货信息</view></view> </templat…