OpenCV4.8+YOLO11C++部署推理

OpenCV学堂 2025-04-25 23:03
图片

点击上方蓝字关注我们

微信公众号:OpenCV学堂

关注获取更多计算机视觉与深度学习知识

自从YOLOv5更新成7.0版本,YOLOv8、YOLO11推出以后,OpenCV4.6以前的版本都无法再加载导出ONNX格式模型了,只有OpenCV4.7以上版本才可以支持最新版本YOLOv5、YOLOv8、YOLO11模型的推理部署。首先看一下最新版本的YOLO11的输入与输出格式:
图片

就会发现,跟YOLOv8输入与输出结果完全一致,没有什么改变。

推理演示截图:

图片
图片
图片

代码已经全部测试过了,可以直接调用:

  1. #include

  2. #include

  3. #include


  4. std::string label_map ="D:/python/yolov5-7.0/classes.txt";

  5. int main(int argc,char** argv){

  6.     std::vector<std::string> classNames;

  7.     std::ifstream fp(label_map);

  8.     std::string name;

  9. while(!fp.eof()){

  10.         getline(fp, name);

  11. if(name.length()){

  12.             classNames.push_back(name);

  13. }

  14. }

  15.     fp.close();

  16.     std::vector<cv::Scalar> colors;

  17.     colors.push_back(cv::Scalar(0,255,0));

  18.     colors.push_back(cv::Scalar(0,255,255));

  19.     colors.push_back(cv::Scalar(255,255,0));

  20.     colors.push_back(cv::Scalar(255,0,0));

  21.     colors.push_back(cv::Scalar(0,0,255));

  22.     std::string onnxpath ="D:/projects/yolov8n.onnx";

  23. auto net = cv::dnn::readNetFromONNX(onnxpath);


  24.     net.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV);

  25.     net.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);

  26.     cv::VideoCapture capture("D:/images/video/sample.mp4");

  27.     cv::Mat frame;

  28. while(true){

  29. bool ret = capture.read(frame);

  30. if(frame.empty()){

  31. break;

  32. }

  33.         int64 start = cv::getTickCount();

  34. // 图象预处理 - 格式化操作

  35. int w = frame.cols;

  36. int h = frame.rows;

  37. int _max = std::max(h, w);

  38.         cv::Mat image = cv::Mat::zeros(cv::Size(_max, _max), CV_8UC3);

  39.         cv::Rect roi(0,0, w, h);

  40.         frame.copyTo(image(roi));

  41. float x_factor = image.cols /640.0f;

  42. float y_factor = image.rows /640.0f;


  43. // 推理

  44.         cv::Mat blob = cv::dnn::blobFromImage(image,1/255.0, cv::Size(640,640), cv::Scalar(0,0,0),true,false);

  45.         net.setInput(blob);

  46.         cv::Mat preds = net.forward();

  47. // 后处理, 1x84x8400

  48.         cv::Mat outs(preds.size[1], preds.size[2], CV_32F, preds.ptr());

  49.         cv::Mat det_output = outs.t();

  50. float confidence_threshold =0.5;

  51.         std::vector<cv::Rect> boxes;

  52.         std::vector classIds;

  53.         std::vector confidences;

  54. for(int i =0; i < det_output.rows; i++){

  55.             cv::Mat classes_scores = det_output.row(i).colRange(4, preds.size[1]);

  56.             cv::Point classIdPoint;

  57. double score;

  58.             minMaxLoc(classes_scores,0,&score,0,&classIdPoint);

  59. // 置信度 0~1之间

  60. if(score >0.25)

  61. {

  62. float cx = det_output.at(i,0);

  63. float cy = det_output.at(i,1);

  64. float ow = det_output.at(i,2);

  65. float oh = det_output.at(i,3);

  66. int x =static_cast((cx -0.5* ow)* x_factor);

  67. int y =static_cast((cy -0.5* oh)* y_factor);

  68. int width =static_cast(ow * x_factor);

  69. int height =static_cast(oh * y_factor);

  70.                 cv::Rect box;

  71.                 box.= x;

  72.                 box.= y;

  73.                 box.width = width;

  74.                 box.height = height;


  75.                 boxes.push_back(box);

  76.                 classIds.push_back(classIdPoint.x);

  77.                 confidences.push_back(score);

  78. }

  79. }


  80. // NMS

  81.         std::vector indexes;

  82.         cv::dnn::NMSBoxes(boxes, confidences,0.25,0.50, indexes);

  83. for(size_t i =0; i < indexes.size(); i++){

  84. int index = indexes[i];

  85. int idx = classIds[index];

  86.             cv::rectangle(frame, boxes[index], colors[idx %5],2,8);

  87.             cv::rectangle(frame, cv::Point(boxes[index].tl().x, boxes[index].tl().-20),

  88.                 cv::Point(boxes[index].br().x, boxes[index].tl().y), cv::Scalar(255,255,255),-1);

  89.             cv::putText(frame, classNames[idx], cv::Point(boxes[index].tl().x, boxes[index].tl().-10), cv::FONT_HERSHEY_SIMPLEX,.5, cv::Scalar(0,0,0));

  90. }


  91. float t =(cv::getTickCount()- start)/static_cast(cv::getTickFrequency());

  92.         putText(frame, cv::format("FPS: %.2f",1.0/ t), cv::Point(20,40), cv::FONT_HERSHEY_PLAIN,2.0, cv::Scalar(255,0,0),2,8);

  93. char c = cv::waitKey(1);

  94. if(==27){

  95. break;

  96. }

  97.         cv::imshow("OpenCV4.8 + YOLOv8", frame);

  98. }

  99.     cv::waitKey(0);

  100.     cv::destroyAllWindows();

  101. return0;

  102. }



1

QT5 + OpenCV4入门到实战-路线图




课程简介
系统化掌握QT应用开发技能与相关软件工程知识,掌握QT桌面应用开发常用的UI组件、元数据系统、多线程、设计模式、学会基于OpenCV实验大师工具软件与工作流引擎库高效开发OpenCV算法与QT界面集成,YOLOv8系列模型多线程推理集成、完成人脸识别、读码、模板匹配、测量、Blob检测、圆检测、线段检测、轮廓查找、安防入侵检测、健身计数、电子围栏系统、乌班图嵌入式开发板QT+深度学习 + OpenCV4.8 人脸识别、自动水印移除等应用开发与移植案例。课程总结课时数超过80+,提供了超过100页详细电子文档,近万行C++代码,数十个各种QT+OpenCV+深度学习 案例,提供电子书资料。对标工作岗位,快人一步,学完就入职。

适合人群
需要掌握QT5 + OpenCV的开发者、高校高年级本科生与研究生、需要完成深度学习应用开发的开发者、上位机开发者。


优惠活动
原价:498
优惠:399
扫描即可查看课程目录
图片


推荐阅读

OpenCV4.8+YOLOv8对象检测C++推理演示

ZXING+OpenCV打造开源条码检测应用

攻略 | 学习深度学习只需要三个月的好方法

三行代码实现 TensorRT8.6 C++ 深度学习模型部署

实战 | YOLOv8+OpenCV 实现DM码定位检测与解析

对象检测边界框损失 – 从IOU到ProbIOU

初学者必看 | 学习深度学习的五个误区



图片

OpenCV学堂 专注计算机视觉开发技术分享,技术框架使用,包括OpenCV,Tensorflow,Pytorch教程与案例,相关算法详解,最新CV方向论文,硬核代码干货与代码案例详解!作者在CV工程化方面深度耕耘15年,感谢您的关注!
评论
  • 电磁场的作用主要体现在以下几个方面:首先在能源领域,电磁场是发电、输电的基础。无论是火力发电还是核电站,*终都需要通过电磁感应原理将机械能转化为电能。高压输电线路则利用交变电磁场实现电能的远距离传输,为现代工业和生活提供动力保障。在通信技术方面,电磁波作为电磁场的传播形式,构成了无线通信的基础。从无线电广播到5G移动网络,从卫星通信到光纤传输,本质上都是对特定频段电磁场的**控制和利用。雷达系统通过发射和接收电磁波实现目标探测,在气象预报、航空管制等领域不可huo缺。在医疗领域,电磁场技术为诊断
    锦正茂科技 2025-05-19 13:19 78浏览
  • ETC系统是一种高速公路或桥梁自动收费系统。插卡式ETC是长这个样子的,正面如下图。背面是有一小块太阳能板的,还有一个按钮开关,如下图。用工具拆开上盖,可以看见电池,显示屏,卡片,如下图。取下PCB板,可以看见背面,如下图。J5,J6脚是接太阳能板的正负极的,SKYRELAY(斯凯瑞利) SKY1311T 读卡器芯片,内部集成了多种通信协议。SKY1311T芯片通过内置的硬件加密引擎和高级加密标准(AES)来实现数据的加密传输,保证数据的安全性。169E 具体的数据手册没有查到,猜测是
    liweicheng 2025-05-17 21:41 135浏览
  • 什么是信号量信号量能干啥信号量的函数实例举例总结什么是信号量简而言之,就是发出通知,接收通知的任务获得通知后去干啥啥。通知有多有少。自定义通知数量的,叫计数型信号量;只有有无(即“0”,“1”)通知的,叫二进制信号量。信号量能干啥资源管理:控制多个任务对共享资源(如外设、内存块)的访问权限,避免竞争条件任务同步 :实现任务间的时序协调(如等待某个事件完成)中断与任务通信:在中断服务程序(ISR)中快速通知任务处理事件(需使用 xxxFromISR 版本的函数)信号量的函数创建二进制信号量函数原型
    二月半 2025-05-18 20:48 113浏览
  • 这算是一款挺经典的“轨迹球”,它与其它品牌轨迹球最大的不同是它有个大圆环形状的滚轮,缩放图片、浏览网页非常方便,据说这还是Kensington独有的专利。我要拆解的这款轨迹球的型号是:K72337,算是同品牌系列里最最基础的入门款,优点是价廉物美(人民币200元左右),缺点是球的直径略小(40mm)—— 要想精准定位光标位置需要先有操控它的娴熟度,还有就是这款可供组合的按键也太少(高配型号有多个自定义按键),但好在我当年入手它就只是为了提高工作效率(用于文字编辑、程序修改、PPT绘图、音频剪辑等
    牛言喵语 2025-05-18 05:42 115浏览
  • 什么是互斥量互斥量的应用场合互斥量的API函数基本代码结构互斥量使用举例递归锁递归锁举例总结什么是互斥量在freeRTOS中,多个任务访问一块共享资源,会产生竞争现象。比如马路上只有一个很早以前的电话亭,A、B都想要打电话,然后他们就开始打架了。但是如果A先进去了然后把门锁了,B想进去打电话的话只能在外面等,必须等到A把门锁打开。互斥量的应用场合像freeRTOS的多任务系统,任务A正在使用某个资源,还没用完的时候,任务B也来使用,就可能会导致问题。就比如串口,任务A正在用串口发送数据,此时任务
    二月半 2025-05-18 20:54 116浏览
  • 电磁场是自然界中一种特殊的物质存在形式,由相互依存且能够相互转化的电场和磁场共同构成。这种无形的物理场充满整个空间,既能够传递电磁力,也能够以电磁波的形式传播能量。电场源于静止或运动的电荷,表现为对带电粒子施加作用力的能力;而磁场则产生于电流或变化的电场,能够影响运动电荷的轨迹。两者通过动态耦合形成统一的电磁场系统,其行为规律由麦克斯韦方程组完整描述。这个方程组包含四个基本方程,分别揭示了电荷如何产生电场、磁场无孤立磁荷的特性、变化磁场激发电场的规律,以及电流与变化电场共同产生磁场的机制。电磁场
    锦正茂科技 2025-05-19 13:07 76浏览
  • 【拆解】+TFT LCD 通用测试仪拆解 目前对于车载行业,显示屏在整车的份额越来越高。各个供应商或者下级供应商都会回针对TFT的开发做规划。那么,在TFT测试方面,他们是如何进行产品开发前的测试和有效性验证的内。是的,无非就是他们公司自己开发点亮治具或者从治具供应商那边购买点亮设备。客户只需要提供客户需求。有能力的供应商就好针对需求进行分解开发。在规定的时间内完成产品的开发和交付。今天我们就来看看用在车载显示屏或者消费电子上面的TFT点亮治具—TFT LCD通用测试仪式怎么设计出来的。 如下就
    zhusx123 2025-05-18 14:07 113浏览
  • 非常荣欣参加了这次《7天造一台无人机》试读体验活动,同时非常感谢面包板论坛举办此活动。本书印刷还是非常新颖,具有精美漫画。下图为图书正面。 本书主要介绍组装、调试一架四旋翼无人机的完整流程,包括组装无人机机架、安装电机和螺旋桨、电池充电保养、安装飞控、飞行前调试,并且在组装、调试过程中依次介绍了飞行原理、动力系统、遥控器、电池、飞控等相关基础知识。 本书共分为7章。第1章首先介绍了无人机学习的一些方法,避免大家在学习无人机时走弯路;然后介绍了无人机的基础知识,并对四旋翼无人机的概念、飞行原理和各
    shenwen2007_656583087 2025-05-17 12:07 76浏览
  • 北京贞光科技作为三星电机一级代理商,提供全面升级的技术支持、样品供应和供应链保障服务,为客户提供专业、可靠的一站式解决方案,满足AI基础设施不断发展的需求,支持更高效、更强大的人工智能应用计算系统的开发。如需更多产品信息或技术支持,请联系贞光科技。三星电子在被动元件技术领域取得重大突破,推出专为AI服务器应用设计的超小型高容量多层陶瓷电容器(MLCC)。这些新组件解决了现代AI计算基础设施不断增长的电力需求,同时优化了密集服务器环境中的空间利用率。 满足AI服务器电力需求现代AI服务器
    贞光科技 2025-05-20 11:38 81浏览
  • 随着智能硬件设备的快速发展,蓝牙音频语音芯片在智能家居、穿戴设备、车载电子等领域得到广泛应用。蓝牙音频语音芯片凭借其低功耗、高集成度和灵活的通信接口,成为许多开发者的选择。然而,在实际应用中,开发者可能会遇到IC芯片通过串口或MCU通信时无响应的问题。本文将从通信接口配置与故障排查角度,普及相关知识并提供解决方案。一、通信接口基础配置串口接线规则蓝牙芯片的串口通信需遵循“交叉连接”原则:TX(发送端)→ RX(接收端)RX(接收端)→ TX(发送端)若接线错误(如TX-TX或RX-RX直连),数
    广州唯创电子 2025-05-19 09:47 58浏览
  •   头部技术企业核心能力与行业解决方案解析   华盛恒辉科技有限公司   华盛恒辉科技有限公司:是一家专注于高端软件定制开发服务和高端建设的服务机构,致力于为企业提供全面、系统的开发制作方案。在部队政企开发、建设到运营推广领域拥有丰富经验,在教育,工业,医疗,APP,管理,商城,人工智能,部队软件、工业软件、数字化转型、新能源软件、光伏软件、汽车软件,ERP,系统二次开发,CRM等领域有很多成功案例。   五木恒润科技有限公司   五木恒润科技有限公司:是一家专业的部队信息化建设服务单位
    华盛恒辉l58ll334744 2025-05-19 17:18 123浏览
  •   在数字技术重塑商业格局的当下,品牌如何借助创新工具实现价值跃升成为企业战略核心。软件开发已从单纯的技术迭代载体,演变为企业连接用户、驱动增长的关键纽带。因此,筛选靠谱的软件开发公司,成为企业数字化转型的重要决策 —— 专业公司凭借技术积累与行业经验定制解决方案,权威公司则以规范服务与交付能力保障项目落地。   筛选靠谱软件开发公司的三大核心标准   标准 1:技术适配性与行业匹配度   技术适配性:优先选择掌握云计算、AI 集成、低代码开发等前沿技术的团队。   行业匹配度:医疗
    华盛恒辉l58ll334744 2025-05-20 15:46 73浏览
  • 在智能化、数字化与信息化的时代浪潮下,物联网凭借着多频段间的通信协同能力与多协议间的通信兼容能力构建起了一张张无缝互通的IoT设备网络。从Sub-GHz频段到2.4GHz频段,从BLE/Wi-Fi协议到LoRa/Wi-SUN协议,多种频段资源与通信协议不仅推动了智能抄表、智能家居与工业自动化等领域的繁荣发展,还为万物互联的未来愿景奠定了坚实的底层通信基础。然而,随着无线通信技术的高速发展与全球IoT设备数量的持续增长,频段资源的有限性愈发凸显,在科技园区、交通枢纽与CBD等通信密集区域,同一频段
    华普微HOPERF 2025-05-20 11:07 86浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦