【绝对有用】C++ 实现 计算机视觉任务-yolo目标检测 NMS

为了在C++中实现非极大值抑制(NMS),我们需要以下步骤:

  1. 定义边界框和置信度的结构。
  2. 实现计算IoU的函数。
  3. 实现NMS的函数。

下面是一个完整的C++代码示例:

完整的C++代码实现NMS

#include <algorithm> // std::max, std::min, std::sort
#include <vector>    // std::vector
#include <iostream>  // std::coutstruct Box {float x, y, w, h; // x, y 为左上角坐标,w, h 为宽度和高度float confidence; // 置信度
};// 计算两个边界框的 IoU
float iou(const Box& box1, const Box& box2) {float xi1 = std::max(box1.x, box2.x);float yi1 = std::max(box1.y, box2.y);float xi2 = std::min(box1.x + box1.w, box2.x + box2.w);float yi2 = std::min(box1.y + box1.h, box2.y + box2.h);float inter_width = std::max(0.0f, xi2 - xi1);float inter_height = std::max(0.0f, yi2 - yi1);float inter_area = inter_width * inter_height;float box1_area = box1.w * box1.h;float box2_area = box2.w * box2.h;float union_area = box1_area + box2_area - inter_area;return inter_area / union_area;
}// 非极大值抑制 (NMS)
std::vector<Box> non_max_suppression(const std::vector<Box>& boxes, float iou_threshold) {// 按置信度降序排序std::vector<Box> sorted_boxes = boxes;std::sort(sorted_boxes.begin(), sorted_boxes.end(), [](const Box& a, const Box& b) {return a.confidence > b.confidence;});std::vector<Box> selected_boxes;std::vector<bool> suppressed(sorted_boxes.size(), false);for (size_t i = 0; i < sorted_boxes.size(); ++i) {if (suppressed[i]) continue;const Box& boxA = sorted_boxes[i];selected_boxes.push_back(boxA);for (size_t j = i + 1; j < sorted_boxes.size(); ++j) {if (suppressed[j]) continue;const Box& boxB = sorted_boxes[j];if (iou(boxA, boxB) > iou_threshold) {suppressed[j] = true;}}}return selected_boxes;
}int main() {std::vector<Box> boxes = {{30, 40, 50, 60, 0.9},{32, 42, 48, 58, 0.8},{28, 38, 52, 62, 0.75},{100, 200, 30, 40, 0.6},{29, 39, 51, 61, 0.4}};float iou_threshold = 0.5;std::vector<Box> result = non_max_suppression(boxes, iou_threshold);std::cout << "Selected boxes after NMS:" << std::endl;for (const auto& box : result) {std::cout << "Box: (" << box.x << ", " << box.y << ", " << box.w << ", " << box.h << "), Confidence: " << box.confidence << std::endl;}return 0;
}

解释

  1. Box结构体

    • Box结构体包含左上角坐标(x, y)、宽度和高度(w, h)、以及置信度(confidence)。
  2. 计算IoU的函数

    • iou函数计算两个边界框之间的交集和并集,然后返回IoU。
  3. NMS函数

    • non_max_suppression函数首先按置信度对边界框进行排序。
    • 然后遍历排序后的边界框,如果当前边界框没有被抑制,选择它并将其添加到最终结果中。
    • 接着,计算当前边界框与其余边界框的IoU,如果IoU超过阈值,则将这些边界框标记为已抑制。
  4. 主函数测试

    • 定义了一组边界框和置信度,并调用non_max_suppression函数进行NMS处理。
    • 最后输出经过NMS处理后的边界框。

通过以上步骤,你可以在C++中实现非极大值抑制(NMS),用于目标检测中的后处理。

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

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

相关文章

设置日历程序

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 namespace 设置日历 {public partial class Form1 : Form{public Form1(){InitializeComponent();}private void dateTimePicker1_ValueChanged(object sender, EventArgs e){richTextBox1.Text dateTimePicker1.T…

【教程】安装DGL/PyG图神经网络编程环境

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 关于cuda的安装&#xff0c;可以看这个&#xff1a; 【教程】保姆级安装NVIDIA CUDA、CUDNN环境全纪录解决SSH一段时间自动断开报Destination Host Un…

大数据------JavaWeb------MyBatis(完整知识点汇总)

MyBatis MyBatis简介 定义 它是一款优秀的持久层框架&#xff0c;用于简化JDBC开发它原来是Apache的一个开源项目iBatis&#xff0c;后来改名为MyBatis中文官网&#xff1a;https://mybatis.org/mybatis-3/zh_CN/index.html JaveEE三层架构 表现层&#xff08;做页面展示&…

Elasticsearch:大数据时代的实时搜索与分析利器

引言 随着大数据时代的到来&#xff0c;数据量的爆炸式增长对数据存储、检索和分析提出了前所未有的挑战。Elasticsearch&#xff08;ES&#xff09;作为一个分布式搜索和分析引擎&#xff0c;凭借其强大的全文搜索能力、实时数据处理和高可扩展性&#xff0c;迅速成为大数据处…

Coldrage Dagger

剃刀高地【寒怒匕首 Coldrage Dagger】 2020.11.26.剃刀高地刷【寒怒匕首】-1_网络游戏热门视频 2020.11.26.剃刀高地刷【寒怒匕首】-2_网络游戏热门视频

HarmonyOS NEXT Developer Beta1最新术语表

A abc文件 方舟字节码&#xff08;ArkCompiler Bytecode&#xff09;文件&#xff0c;是ArkCompiler的编译工具链以源代码作为输入编译生成的产物&#xff0c;其文件后缀名为.abc。在发布态&#xff0c;abc文件会被打包到HAP中。 ANS Advanced Notification Service&#xf…

C++11中std::thread的使用

C11 引入了 std::thread&#xff0c;它是用于创建和管理线程的标准库类。以下是详细的讲解&#xff0c;包括如何使用 std::thread 进行线程创建、管理和参数传递等操作。 1. 包含必要的头文件 在使用 std::thread 前&#xff0c;需要包含 <thread> 头文件&#xff1a; …

SpringSecurity-授权示例

用户基于权限进行授权 定义用户与权限 authorities()。 package com.cms.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.core.userdetails.User; import…

台式机通过网线直连笔记本,台式机通过笔记本上网【解决台式机没有网络的问题】

一、总览 将笔记本电脑和台式机使用网线连接起来。在笔记本电脑上打开网络和共享中心&#xff0c;进入“更改适配器设置”选项&#xff0c;找到当前连接的网卡&#xff0c;右键点击选择“属性”。在网卡属性中&#xff0c;找到“共享”选项卡&#xff0c;勾选“允许其他网络用…

CentOS 7Linux配置阿里源-2

要在Linux系统上配置阿里源&#xff0c;您可以按照以下步骤操作&#xff1a; 备份旧的软件源配置&#xff08;可选&#xff09;&#xff1a; 如果您想保留原始的软件源配置&#xff0c;可以先进行备份。例如&#xff0c;对于CentOS系统&#xff0c;您可以将/etc/yum.repos.d/Ce…

湖北大学2024年成人高考函授报名专升本法学专业介绍

湖北大学&#xff0c;这所承载着深厚文化底蕴和学术积淀的高等学府&#xff0c;始终致力于为广大有志之士提供多元化的学习机会。在时代的浪潮中&#xff0c;为了满足社会对于高层次法律人才的需求&#xff0c;湖北大学特别推出了成人高等继续教育项目&#xff0c;为广大在职人…

黄历工具网/万年历/财神方位/日历/佛历/道历/24节气/PHP网站源码

黄历工具网/万年历/财神方位/日历/佛历/道历/24节气/PHP网站源码 演示地址&#xff1a; https://hl.caohongji.com/ 手机端地址&#xff1a; https://mhl.caohongji.com/ 客服&#xff1a; kkmp326 源码说明&#xff1a; 1、系统内的黄历宜忌、农历、日历、佛历、道…

MySQL——聚合函数及分组过滤

聚合函数&#xff08;常用&#xff09; 函数名称描述COUNT()计数 SUM() 求和AVG()平均值MAX()最大值MIN()最小值...... -- 都能够统计表中的数据&#xff08;查询表中有多少个记录&#xff09; SELECT COUNT(studentname) FROM student -- COUNT(字段)&#xff0c;会忽略所有…

cpp类与对象(上2)

目录 封装 类的作用域 类的实例化 类对象模型 如何计算类对象的大小 类对象的存储方式 结构体内存对齐规则 this指针 this指针的特性 C语言和C实现Stack的对比 C实现 C实现 封装 面向对象的三大特性&#xff1a;封装、继承、多态。 封装&#xff1a;将数据和操作数据…

前端基础--Vue2

前端技术发展史(了解) 1.前端历史 1.1.静态网页 1990 html 1.2.异步刷新-操作dom 1995 javascript 1.3.动态网站 Asp/jsp&#xff08;java&#xff09;,php等&#xff0c;后台臃肿 1.4.Ajax成为主流 异步请求 1.5.Html5 被认为是互联网的核心技术之一。HTML产生于19…

Docker之jekins的安装

jekins官网地址&#xff1a;Jenkins Plugins &#xff08;https://plugins.jenkins.io/&#xff09; jekins 的docker 官方地址&#xff1a;https://hub.docker.com/r/jenkins/jenkins jekins 的docker 允许命令文档地址&#xff1a; docker/README.md at master jenkinsci…

Python图形编程-OpenGL开发环境搭建

OpenGL开发环境搭建 文章目录 OpenGL开发环境搭建1、安装依赖模块2、顶点数组对象 (VAO)3、顶点缓冲区 (VBO)4、着色器程序5、程序入口6、完整代码7、模型-视图-投影矩阵示例7.1 创建模型-视图-投影矩阵7.2 创建Uniform变量7.3 完整代码本文将详细介绍如何搭建基于Python的…

学分制系统 WebService_PantoSchool SQL注入致RCE漏洞复现

0x01 产品简介 学分制系统由上海鹏达计算机系统开发有限公司研发,是基于对职业教育特点和需求的深入理解,结合教育部相关文件精神,并广泛吸纳专家、学者意见而开发的一款综合性管理系统。系统采用模块化的设计方法,方便学校根据自身教学改革特点、信息化建设进程情况选择、…

Kubernetes之Scheduler详解

本文尝试从Kubernetes Scheduler的功能介绍、交互逻辑、伪代码实现、最佳实践、自定义Scheduler举例及其历史演进6个方面进行详细阐述。希望对您有所帮助&#xff01; 一、Kubernetes Scheduler 功能 Kubernetes Scheduler 是 Kubernetes 集群的核心组件之一&#xff0c;负责…

Qwen2本地web Demo

Qwen2的web搭建(streamlit) 千问2前段时间发布了&#xff0c;个人觉得千问系列是我用过最好的中文开源大模型&#xff0c;所以这里基于streamlit进行一个千问2的web搭建&#xff0c;来进行模型的测试 一、硬件要求 该文档中使用的千问模型为7B-Instruct&#xff0c;需要5g以…