当前位置: 首页 > news >正文

计算3D目标框的NMS

3D障碍物目标框(中心点坐标XYZ、长宽高lwh、朝向角theta)的非极大值抑制

#include <iostream>
#include <vector>
#include <algorithm>
#include <opencv2/opencv.hpp>// 定义3D目标框的结构体
struct BoundingBox3D
{double centerX, centerY, centerZ; // 中心点坐标double length, width, height;     // 长宽高double theta;                     // 朝向角double score;                     // 目标框得分BoundingBox3D(double x, double y, double z, double l, double w, double h, double t, double s): centerX(x), centerY(y), centerZ(z), length(l), width(w), height(h), theta(t), score(s) {}
};class NMS3D
{
public:// 构造函数,传入IoU阈值NMS3D(double iouThreshold) : iouThreshold_(iouThreshold) {}// 执行NMSstd::vector<BoundingBox3D> executeNMS(const std::vector<BoundingBox3D> &boxes){std::vector<BoundingBox3D> resultBoxes;// 按得分降序排序std::vector<BoundingBox3D> sortedBoxes = sortBoxesByScore(boxes);// 遍历排序后的框while (!sortedBoxes.empty()){// 保留得分最高的框BoundingBox3D topBox = sortedBoxes[0];resultBoxes.push_back(topBox);// 移除与当前框IoU大于阈值的框sortedBoxes.erase(sortedBoxes.begin());sortedBoxes = removeOverlappingBoxes(topBox, sortedBoxes);}return resultBoxes;}private:// 按得分降序排序std::vector<BoundingBox3D> sortBoxesByScore(const std::vector<BoundingBox3D> &boxes){std::vector<BoundingBox3D> sortedBoxes = boxes;std::sort(sortedBoxes.begin(), sortedBoxes.end(),[](const BoundingBox3D &a, const BoundingBox3D &b){return a.score > b.score;});return sortedBoxes;}// 移除与指定框IoU大于阈值的框std::vector<BoundingBox3D> removeOverlappingBoxes(const BoundingBox3D &box,const std::vector<BoundingBox3D> &boxes){std::vector<BoundingBox3D> filteredBoxes;for (const auto &b : boxes){if (calculateIoU(box, b) < iouThreshold_){filteredBoxes.push_back(b);}}return filteredBoxes;}// 计算两个框的IoU(Intersection over Union)double calculateIoU(const BoundingBox3D &box1, const BoundingBox3D &box2){// 计算两个框的相交部分的体积double intersectionVolume = calculateIntersectionVolume(box1, box2);// 计算两个框的并集部分的体积double unionVolume = box1.length * box1.width * box1.height +box2.length * box2.width * box2.height -intersectionVolume;// 计算IoUreturn intersectionVolume / unionVolume;}// 计算两个框的相交部分的体积double calculateIntersectionVolume(const BoundingBox3D &box1, const BoundingBox3D &box2){// 计算平面重叠面积double intersectArea = calIntersectionArea(box1, box2);double intersectHeight = calculateOverlap(box1.centerZ, box1.height, box2.centerZ, box2.height);// 计算相交部分的体积return intersectArea * intersectHeight;}cv::Point rotatePoint(const cv::Point &point, double angle){double rotatedX = point.x * cos(angle) - point.y * sin(angle);double rotatedY = point.x * sin(angle) + point.y * cos(angle);return cv::Point(rotatedX, rotatedY);}double calIntersectionArea(const BoundingBox3D &box1, const BoundingBox3D &box2){cv::RotatedRect rect1(cv::Point2f(box1.centerX,box1.centerY),cv::Size2f(box1.width,box1.height),box1.theta);cv::RotatedRect rect2(cv::Point2f(box2.centerX,box2.centerY),cv::Size2f(box2.width,box2.height),box2.theta);std::vector<cv::Point2f> intersection;cv::rotatedRectangleIntersection(rect1,rect2, intersection);// std::cout <<rect1.center<< " "<<rect2.center<<std::endl;// std::cout <<rect1.size<< " "<<rect2.size<<std::endl;// std::cout << "intersection area:"<<intersection.size()<<std::endl;double union_area = cv::contourArea(intersection);// std::cout << "intersection area:"<<union_area<<std::endl;return union_area;}// 计算两个轴上的重叠部分长度double calculateOverlap(double center1, double size1, double center2, double size2){double halfSize1 = size1 / 2;double halfSize2 = size2 / 2;double min1 = center1 - halfSize1;double max1 = center1 + halfSize1;double min2 = center2 - halfSize2;double max2 = center2 + halfSize2;// 计算重叠部分长度return std::max(0.0, std::min(max1, max2) - std::max(min1, min2));}double iouThreshold_; // IoU阈值
};int main()
{std::vector<BoundingBox3D> inputBoxes;inputBoxes.push_back(BoundingBox3D(0.0, 0.0, 0.0, 200.0,200.0, 200.0, 45, 0.9));inputBoxes.push_back(BoundingBox3D(100,100, 10, 200.0, 200.0, 200.0, -45, 0.8));//inputBoxes.push_back(BoundingBox3D(2.0, 2.0, 2.0, 2.0, 1.0, 1.0, 0, 0.7));double iouThreshold = 0.5; // 可根据实际情况调整IoU阈值NMS3D nms(iouThreshold);std::vector<BoundingBox3D> resultBoxes = nms.executeNMS(inputBoxes);// 输出结果框for (const auto &box : resultBoxes){std::cout << "Center: (" << box.centerX << ", " << box.centerY << ", " << box.centerZ << "), "<< "Dimensions: (" << box.length << ", " << box.width << ", " << box.height << "), "<< "Theta: " << box.theta << ", "<< "Score: " << box.score << std::endl;}return 0;
}

关于cv::contourArea可能计算不准的问题,是由于传入的点没有按照一定的顺序排列(顺时针或逆时针)。参考解决博客

相关文章:

计算3D目标框的NMS

3D障碍物目标框&#xff08;中心点坐标XYZ、长宽高lwh、朝向角theta&#xff09;的非极大值抑制 #include <iostream> #include <vector> #include <algorithm> #include <opencv2/opencv.hpp>// 定义3D目标框的结构体 struct BoundingBox3D {double …...

【Java实现图书管理系统】

图书管理系统 1. 设计背景2. 设计思路3. 模块展示代码演示3.1 Book类3.2 BookList类&#xff08;书架类&#xff09;3.4 用户类 - User类3.5 子类管理员类 -- AdminUser类3.6 子类普通用户类 -- NormalUser类3.7 操作接口3.8 操作类3.8.1 查找操作 -- FindOperation类3.8.2 增加…...

ROS 多机器人导航RVIZ环境的配置

文章目录 前言一、添加多个2D Pose Estimate/2D nav Goal二、RVIZ的其他配置1.RobotModel 总结 前言 前文ROS Turtlebot3多机器人编队导航仿真写了多机器人呢导航的代码实现&#xff0c;本文主要说明&#xff0c;RVIZ导航环境的配置&#xff0c;如何添加多个2D Pose Estimate/…...

UE4 / UE5 内存与性能优化

性能优化 资源压缩粒子优化NavMeshGenerate Overlap EventGCMarkTime光照优化Shader优化卡的时间长LOD官方CPU、GPU Insights、stat cpu、 ue4 memory report、inter GPA 、RenderDOC、减少模型面数等 资源压缩 在图片资源上右键选择Size Map可以看到资源所占大小&#xff0c;…...

dotnet core程序部署到ubuntu

visual studio2022编译好的dotnet core程序&#xff0c;打开“程序包管理器控制台”&#xff0c;打包发布dotnet core,使用命令 dotnet publish -c Release -r ubuntu.22.04-x64打包会生成ubuntu22.04-x64文件夹&#xff0c;将这个文件夹传到ubuntu服务器&#xff0c;切换到ubu…...

Antv/G2 柱状图添加自定义点击事件

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>柱状图点击事件</title></head><body><div id"container" /><script src"https://gw.alipayobjects.com/os/lib/antv/g2/4.2.8/…...

Python---数据序列中的公共方法

公共方法就是 支持大部分 数据 序列。 常见公共方法---简单 运算符描述支持的容器类型合并字符串、列表、元组* 复制字符串、列表、元组in元素是否存在字符串、列表、元组、字典not in元素是否不存在字符串、列表、元组、字典 案例&#xff1a; 合并 代码&#xff1…...

从0开始python学习-33.夹具@pytest.fixture(scope=““,params=““,autouse=““,ids=““,name=““)

目录 1. 创建夹具 1.1 pytest方式 1.2 unittest方式 2. 使用夹具 2.1 通过参数引用 2.2 通过函数引用 3. 参数详解 3.1 scope&#xff1a;作用域 3.2 params-参数化 3.3 autouseTrue表示自动使用&#xff0c;默认为False 3.4 ids&#xff1a;设置变量名 3.5 name&am…...

vue3别名配置(vite)

1、配置别名的优点&#xff1a; 在VUE项目中import导入文件时&#xff0c;可以写相对路径. 2、在vite.config.js中配置 a. 首先引入path import path from "path"/* */ b.在resolve添加别名&#xff0c;例如&#xff1a; alias:{"~":path.resolve(__di…...

初学UE5 C++①

目录 游戏类 三种时间函数类型函数和提示类型 FName、FString、FText类型相互转化 数组容器 键值容器 集合容器 基本类型打印 UPROPERTY宏 函数 枚举 法1 法2 结构体 其他 蓝图生成时暴露 游戏类 1.创建所需项的类 2.创建游戏模式类&#xff0c;在该类上实现所需…...

ElasticSearch6.8.1 常见错误

1.vm.max_map_count max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 1.1 修改 /etc/sysctl.conf 只添加最后vm值即可&#xff0c;sysctl -p /etc/sysctl.conf net.ipv4.conf.all.accept_redirects0 net.ipv4.tcp_tw_reuse1 n…...

wx.canvasToTempFilePath生成图片保存到相册

微信小程序保存当前画布指定区域的内容导出生成指定大小的图片&#xff0c;记录一下 api&#xff1a;wx.canvasToTempFilePath 效果&#xff1a; 代码&#xff1a;wxml <canvas style"width: {{screenWidth}}px; height: {{canvasHeight}}px;" canvas-id"my…...

HDU1276:士兵队列训练问题 ← STL queue

【题目来源】http://acm.hdu.edu.cn/showproblem.php?pid1276【题目描述】 某部队进行新兵队列训练&#xff0c;将新兵从一开始按顺序依次编号&#xff0c;并排成一行横队&#xff0c;训练的规则如下&#xff1a;从头开始一至二报数&#xff0c;凡报到二的出列&#xff0c;剩下…...

JS 读取excel文件内容 和 将json数据导出excel文件

一、实现将json数据导出为excel文件 1、通过原生js实现 核心方法&#xff1a; function JSONToExcelConvertor(JSONData, FileName, title, filter) {if (!JSONData)return;//转化json为objectvar arrData typeof JSONData ! object ? JSON.parse(JSONData) : JSONData;va…...

ASP.NET限流器的简单实现

一、滑动时间窗口 我为RateLimiter定义了如下这个简单的IRateLimiter接口&#xff0c;唯一的无参方法TryAcquire利用返回的布尔值确定当前是否超出设定的速率限制。我只提供的两种基于时间窗口的实现&#xff0c;如下所示的基于“滑动时间窗口”的实现类型SliddingWindowRateL…...

汇编语言循环左移和循环右移如何实现的,详细的比喻一下

汇编语言中的循环左移&#xff08;ROL&#xff09;和循环右移&#xff08;ROR&#xff09;是两种基本的位操作&#xff0c;通常用于低级编程任务&#xff0c;如加密、解密、数据处理等。我将使用一个详细的比喻来解释这两种操作&#xff0c;以使其更易于理解。 循环左移&#…...

ChromeDriver 各版本下载地址

chromedriver 115及115之后版本下载地址&#xff1a;https://googlechromelabs.github.io/chrome-for-testing/ chromedriver 115之前版本下载地址&#xff1a;http://chromedriver.storage.googleapis.com/index.html...

计算机网络之物理层

物理层 1. 物理层的基本概念 2.物理层下面的传输媒体 传输媒体可分为两类&#xff0c;一类是导引型传输媒体&#xff0c;另一类是非导引型传输媒体。 3.传输方式 3.1 串行传输和并行传输 串行传输&#xff1a;串行传输是指数据是一个比特依次发送的&#xff0c;因此在发送端…...

沉浸式航天vr科普馆VR太空主题馆展示

科普教育从小做起&#xff0c;现在我们的很多地方小孩子游乐体验不单单只有草坪玩耍体验&#xff0c;还有很多科普知识的体验馆和游玩馆。虽然现在我们还不能真实的上太空或者潜入海底&#xff0c;但是这些现在已经可以逼真的展示在我们面前。通过一种虚拟现实技术手段。人们带…...

AI电话机器人能否代替人工?优缺点介绍

AI电话机器人是一种基于人工智能技术的自动语音系统&#xff0c;它可以模拟人类的语音交互&#xff0c;执行客服、销售、调查等任务。随着人工智能的发展&#xff0c;AI电话机器人的功能越来越强大&#xff0c;它们在某些领域已经能够替代人工执行任务。那么&#xff0c;AI电话…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...