使用OpenCV、ONNXRuntime在c++平台部署YOLOV7实时目标检测的代码

时间: 2023-12-31 19:04:00 浏览: 36
好的,以下是一个简单的使用OpenCV和ONNXRuntime在C++平台部署YOLOv7实时目标检测的代码示例: ```c++ #include <iostream> #include <chrono> #include <opencv2/opencv.hpp> #include <onnxruntime_cxx_api.h> using namespace std; using namespace cv; using namespace std::chrono; using namespace Ort; int main() { // 加载模型 Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test"); Ort::SessionOptions session_options; OrtSession* session; Ort::AllocatorWithDefaultOptions allocator; const char* model_path = "yolov7.onnx"; session = new Ort::Session(env, model_path, session_options); // 加载图像 Mat frame = imread("test.jpg"); if (frame.empty()) { cout << "读取图像失败!" << endl; return -1; } // 预处理图像 Mat input_blob = blobFromImage(frame, 1 / 255.0, Size(416, 416), Scalar(0, 0, 0), true, false); Tensor input_tensor = Tensor( DataType::FLOAT, {1, 3, input_blob.rows, input_blob.cols}, input_blob.data ); // 运行模型 vector<const char*> input_names = {"input_1"}; vector<const char*> output_names = {"Identity_1", "Identity_2", "Identity_3"}; vector<Ort::Value> input_tensors = {input_tensor}; vector<Ort::Value> output_tensors = session->Run(Ort::RunOptions{}, input_names.data(), input_tensors.data(), input_names.size(), output_names.data(), output_names.size()); // 后处理输出结果 vector<Mat> detections; for (int i = 0; i < output_tensors.size(); i++) { float* output_data = output_tensors[i].GetTensorMutableData<float>(); vector<int64_t> output_shape = output_tensors[i].GetTensorTypeAndShapeInfo().GetShape(); Mat detection(output_shape[1], output_shape[0], CV_32F, output_data); detections.push_back(detection); } float confidence_threshold = 0.5; vector<int> class_ids; vector<float> confidences; vector<Rect> boxes; for (int i = 0; i < detections.size(); i++) { for (int j = 0; j < detections[i].rows; j++) { float* data = detections[i].ptr<float>(j); float confidence = data[4]; if (confidence > confidence_threshold) { int class_id = j; float left = data[0] * frame.cols; float top = data[1] * frame.rows; float right = data[2] * frame.cols; float bottom = data[3] * frame.rows; int width = right - left + 1; int height = bottom - top + 1; class_ids.push_back(class_id); confidences.push_back(confidence); boxes.push_back(Rect(left, top, width, height)); } } } for (int i = 0; i < boxes.size(); i++) { Scalar color(0, 255, 0); rectangle(frame, boxes[i], color, 2); string label = format("%.2f", confidences[i]); int baseline; Size label_size = getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseline); rectangle(frame, Point(boxes[i].x, boxes[i].y - label_size.height - baseline), Point(boxes[i].x + label_size.width, boxes[i].y), color, FILLED); putText(frame, label, Point(boxes[i].x, boxes[i].y - baseline), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0)); } // 显示结果 namedWindow("YOLOv7", WINDOW_NORMAL); resizeWindow("YOLOv7", 800, 600); imshow("YOLOv7", frame); waitKey(0); // 释放资源 delete session; return 0; } ``` 这段代码首先使用ONNXRuntime加载YOLOv7模型,然后利用OpenCV读取图像并进行预处理,接着调用ONNXRuntime运行模型,最后根据模型输出结果进行后处理并显示检测结果。需要注意的是,这段代码只是一个简单的示例,实际部署时需要根据具体的场景进行调整。

相关推荐

最新推荐

recommend-type

组成原理课程实验:MIPS 流水线CPU、实现36条指令、转发、冒险检测-内含源码和说明书.zip

组成原理课程实验:MIPS 流水线CPU、实现36条指令、转发、冒险检测-内含源码和说明书.zip
recommend-type

setuptools-50.0.2-py3-none-any.whl

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
recommend-type

setuptools-1.1.6.tar.gz

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
recommend-type

CEA二次开发脚本:用于ECSP配比设计

CEA二次开发脚本:用于ECSP配比设计
recommend-type

环形数组是一种特殊的数据结构

环形数组
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。