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

c++ opencv调用yolo onnx文件

网上找了一段代码,测试c++ opencv调用yolo onnx文件

yolov8n.onnx   opencv版本是4.12 ,另外测试了4.4和4.6版本的opencv运行有问题,可能对opencv版本有要求,有待研究,都在编译了contrib库的情况下测试的

#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <iostream>
#include <chrono>int main()
{// 加载 ONNX 模型std::string modelPath = "yolov8n.onnx";cv::dnn::Net net = cv::dnn::readNetFromONNX(modelPath);net.setPreferableBackend(cv::dnn::DNN_BACKEND_DEFAULT);net.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);// 定义完整的COCO数据集类别名称std::vector<std::string> classes = {"person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light","fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow","elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee","skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard","tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple","sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch","potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone","microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear","hair drier", "toothbrush"};// 打开视频文件或摄像头// 0 表示默认摄像头,也可以替换为视频文件路径如 "video.mp4"cv::VideoCapture cap("nfs.mp4");// 检查视频是否成功打开if (!cap.isOpened()) {std::cerr << "Error: Unable to open video source" << std::endl;return -1;}// 获取视频的帧率double fps = cap.get(cv::CAP_PROP_FPS);if (fps == 0) fps = 30.0; // 默认帧率// 用于计算FPS的变量auto lastTime = std::chrono::high_resolution_clock::now();int frameCount = 0;double currentFps = 0.0;cv::Mat frame;while (true) {// 读取帧cap >> frame;// 检查是否成功读取帧if (frame.empty()) {std::cout << "End of video or error reading frame" << std::endl;break;}// 计算FPSframeCount++;auto currentTime = std::chrono::high_resolution_clock::now();auto elapsedTime = std::chrono::duration_cast<std::chrono::milliseconds>(currentTime - lastTime).count();if (elapsedTime >= 1000) { // 每秒更新一次FPScurrentFps = frameCount / (elapsedTime / 1000.0);frameCount = 0;lastTime = currentTime;}// 将图像转换为blob格式cv::Mat blob = cv::dnn::blobFromImage(frame, 1 / 255.0, cv::Size(640, 640), cv::Scalar(0, 0, 0), true, false);net.setInput(blob);// 前向传播, 获取检测结果std::vector <cv::Mat> outputs;net.forward(outputs, net.getUnconnectedOutLayersNames());// output.size [ 1, 84, 8400]int rows = outputs[0].size[2];// 每个目标存储了多少个值(x,y,w,h+类别数)int length = outputs[0].size[1];// 转成单通道outputs[0] = outputs[0].reshape(1, length);// 按对角线翻转cv::transpose(outputs[0], outputs[0]);float* data = (float*)outputs[0].data;float xFactor = (float)frame.cols / 640;float yFactor = (float)frame.rows / 640;// 解析检测结果std::vector<int> classIds;std::vector<float> confidences;std::vector<cv::Rect> boxes;for (int i = 0; i < rows; i++){// 存储每个类别的置信度cv::Mat scores(1, classes.size(), CV_32FC1, data + 4);cv::Point classId;double maxClassScore;// 读取最大置信度并获得它的索引cv::minMaxLoc(scores, 0, &maxClassScore, 0, &classId);if (maxClassScore > 0.1){confidences.push_back(maxClassScore);classIds.push_back(classId.x);float x = data[0];float y = data[1];float w = data[2];float h = data[3];int left = int((x - 0.5 * w) * xFactor);int top = int((y - 0.5 * h) * yFactor);int width = int(w * xFactor);int height = int(h * yFactor);boxes.push_back(cv::Rect(left, top, width, height));}data += length;}// 执行非最大抑制,以消除具有较低置信度的冗余重叠框(NMS)std::vector<int> nmsResult;cv::dnn::NMSBoxes(boxes, confidences, 0.25, 0.7, nmsResult);for (int i = 0; i < nmsResult.size(); i++){int idx = nmsResult[i];int classId = classIds[idx];float confidence = confidences[idx];cv::Rect box = boxes[idx];// 绘制检测框并显示类别名称cv::rectangle(frame, box, cv::Scalar(0, 0, 255), 2);cv::putText(frame, classes[classId] + ": " + std::to_string(confidence).substr(0, 4),cv::Point(box.x, box.y - 10), cv::FONT_HERSHEY_DUPLEX, 1, cv::Scalar(0, 0, 255));}// 在图像上显示FPSstd::string fpsText = "FPS: " + std::to_string(static_cast<int>(currentFps));cv::putText(frame, fpsText, cv::Point(10, 30), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 255, 0), 2);// 显示结果cv::imshow("YOLO Detection", frame);// 按ESC键退出if (cv::waitKey(1) == 27) {break;}}// 释放资源cap.release();cv::destroyAllWindows();return 0;
}

http://www.dtcms.com/a/322853.html

相关文章:

  • 用天气预测理解分类算法-从出门看天气到逻辑回归
  • SymPy 表达式的变量获取:深入理解与正确实践
  • 对数运算法则(rule of logarithmic operations)和对应导数关系
  • 带冷端补偿的热电偶采集方案MAX31855
  • Python(6) -- 数据容器
  • 《原型链的柔性骨架:JavaScript面向对象架 构的动态设计与演化逻辑》
  • 【线性代数】线性方程组与矩阵——(1)线性方程组与矩阵初步
  • Python中的Lambda函数详解
  • 北京JAVA基础面试30天打卡05
  • PowerShell 实战:第 6 章动手实验全攻略(含命令详解与示例)
  • Ubuntu和Windows系统Kafka配置方法
  • 模式组合应用-适配器模式
  • 光伏面板损伤检出率↑91%!陌讯多模态识别算法在无人机巡检的落地实践
  • 基于clodop和Chrome原生打印的标签实现方法与性能对比
  • 深入理解Maven BOM
  • 基于MATLAB的Halo轨道设计与可视化实现
  • [SC]SystemC 常见的编译/语法错误与解法(三)
  • PDF 转 HTML API 数据接口
  • 在Spring Boot项目中如何动态切换数据源、数据库?
  • Redis分布式锁详解:原理、实现与实战案例
  • 【C++11新特性】智能指针,右值引用,移动语义与完美转发,函数对象...
  • Linux运维新手的修炼手扎之第27天
  • pyqt5 ECU编辑demo
  • NX二次开发——面有关的函数
  • 1.2.3 迅猛发展期(2020年至今)
  • 让大模型 “睡觉”:把版本迭代当作人类睡眠来设计(附可直接改造的训练作息表与代码)
  • 104-基于Flask的优衣库销售数据可视化分析系统
  • 100-基于Python的智联招聘数据可视化分析推荐系统
  • 一周学会Matplotlib3 Python 数据可视化-网格 (Grid)
  • 力扣(删除有序数组中的重复项I/II)