YOLOv8 C++部署:OpenCV DNN 实现 V5/V7/V8
在实时目标检测的工业落地场景中,Python 虽然开发便捷,但面对高并发、低延迟的需求时往往力不从心。尤其是部署到边缘设备或嵌入式系统时,资源占用和推理速度成为关键瓶颈。这时候,C++ 凭借其高效的内存管理和极致的性能表现,成了生产环境中的首选。
OpenCV 的 DNN 模块作为轻量级推理引擎的代表,无需依赖庞大的深度学习框架,仅通过 .onnx 文件就能完成模型加载与推断,特别适合对部署简洁性有要求的项目。它原生支持 CUDA 加速,在 NVIDIA GPU 上能轻松突破百帧大关。
架构设计:面向对象 + 统一接口
为了应对不同版本 YOLO 在输出结构上的差异,我们采用了基类封装共性,子类实现特性的设计思路。
Yolo基类负责通用流程:模型加载、图像预处理、结果绘制、参数配置。Yolov5、Yolov7、Yolov8子类各自重写Detect()方法,处理特有的解码逻辑。- 所有模型输入均为 640×640,使用
formatToSquare将原始图像填充为正方形以保持比例不变形。
检测结果结构体
struct Detection {
int class_id{0}; // 类别 ID
float confidence{0.0f}; // 置信度
cv::Rect box{}; // 检测框
};
这个简单的结构体贯穿整个流程,最终用于可视化和业务逻辑判断。
头文件定义:yoloV8.h
#pragma once
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
using namespace cv::dnn;
struct Detection {
int class_id{0};
float confidence{0.0f};
cv::Rect box{};
};
class Yolo {
:
= ;
;
;
{ / ( + (-x)); }
{
col = src.cols;
row = src.rows;
maxEdge = std::(col, row);
cv::Mat square = cv::Mat::(maxEdge, maxEdge, CV_8UC3);
src.((cv::(, , col, row)));
square;
}
inputWidth = ;
inputHeight = ;
modelConfidenceThreshold = ;
modelScoreThreshold = ;
modelNMSThreshold = ;
std::vector<std::string> classNames = { , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , };
};
: Yolo {
:
;
:
confThreshold = ;
nmsThreshold = ;
};
: Yolo {
:
;
:
confThreshold = ;
nmsThreshold = ;
strideSize = ;
strides[] = {, , };
anchors[][] = {
{, , , , , },
{, , , , , },
{, , , , , }
};
};
: Yolo {
:
;
:
confThreshold = ;
nmsThreshold = ;
};

