OpenCV4.8 + YOLO11 C++ 部署推理

科技   2024-12-25 17:14   江苏  

点击上方蓝字关注我们

微信公众号:OpenCV学堂

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

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

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

推理演示截图:

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

  1. #include <opencv2/opencv.hpp>

  2. #include <iostream>

  3. #include <fstream>

  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<float>());

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

  50. float confidence_threshold = 0.5;

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

  52. std::vector<int> classIds;

  53. std::vector<float> 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<float>(i, 0);

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

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

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

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

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

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

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

  70. cv::Rect box;

  71. box.x = x;

  72. box.y = 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<int> 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().y - 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().y - 10), cv::FONT_HERSHEY_SIMPLEX, .5, cv::Scalar(0, 0, 0));

  90. }

  91. float t = (cv::getTickCount() - start) / static_cast<float>(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 (c == 27) {

  95. break;

  96. }

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

  98. }

  99. cv::waitKey(0);

  100. cv::destroyAllWindows();

  101. return 0;

  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学堂
三本书《Java数字图像处理-编程技巧与应用实践》、《OpenCV Android开发实战》、《OpenCV4应用开发-入门、进阶与工程化实践》作者。OpenCV实验大师平台 软件作者,OpenCV开发专家、OpenCV研习社创始人。
 最新文章