尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

OpenCV DNN 与 YOLO 实时目标检测完整指南:把摄像头前的人与车框出来

OpenCV DNN 与 YOLO 实时目标检测完整指南:把摄像头前的人与车框出来 OpenCV DNN 与 YOLO 实时目标检测完整指南把摄像头前的人与车框出来【免费下载链接】opencvOpen Source Computer Vision Library项目地址: https://gitcode.com/GitHub_Trending/opencv31/opencv把摄像头对准屏幕人、车、自行车会被实时框出来框边还标着person: 0.87这样的类别名和置信度——这正是用 OpenCV 的 DNN 模块搭配一个 YOLO 预训练模型能达到的效果。下文带你走通 opencv 项目里目标检测示例的完整链路加载模型、预处理、推理、结果解析与绘制。每一步都讲清楚为什么这么做等你换用自己的模型时可以直接套用这套流程。实时场景在摄像头前框出人与车这一节说明最终产物长什么样以及你会用到哪些现成文件。最终产物是一个小程序打开摄像头或视频文件显示窗口里每一帧都画上检测框和文字标签按任意键退出。opencv 项目官方示例已经把这条链路实现好了涉及的主要文件模型加载与推理主逻辑samples/dnn/object_detection.cpp模型清单与预处理参数表samples/dnn/models.yml类别名称文件COCO 80 类每行一个如 person、car、bicyclesamples/data/dnn/object_detection_classes_coco.txt测试图片与视频lena.jpg、basketball1.png 等samples/data/官方示例编译后可以用一行命令跑起来./example_dnn_object_detection yolov8 --input你的图片路径。你也可以只借鉴这些文件的做法自己写一个最小版本。为什么用 OpenCV DNN YOLODNN 提供推理能力YOLO 提供检测算法两者正好互补。OpenCV 的 DNN 模块负责加载和运行预训练模型核心是 Net 类定义在 modules/dnn/include/opencv2/dnn/dnn.hpp覆盖模型加载、输入设置和推理计算支持 ONNX 等格式导出的模型不需要引入任何深度学习框架。YOLOYou Only Look Once是单阶段目标检测算法一次前向传播就给出整张图的所有框和类别速度快适合实时场景。OpenCV 对 YOLOv5、YOLOv8、YOLOX 等多个版本的支持方式一致推理接口不变换模型文件时只需对应调整输入尺寸和后处理分支。计算方式也可以选。通过net.setPreferableBackend(...)和net.setPreferableTarget(...)分别指定后端与设备DNN_BACKEND_OPENCV走 OpenCV 原生实现DNN_BACKEND_CUDA走 CUDA 加速编译时需开启目标设备则有DNN_TARGET_CPU和DNN_TARGET_CUDA两种。官方示例里--backend和--target参数还支持 openvino、vkcom、webnn、vulkan 等更多选项。一次跑通加载 YOLO 模型与类别文件这一节给出最小可运行片段模型、后端、类别一次配齐。以 YOLOX-S 的 ONNX 模型为例// 加载模型并指定计算后端 Net net readNet(yolox_s.onnx); net.setPreferableBackend(DNN_BACKEND_OPENCV); net.setPreferableTarget(DNN_TARGET_CPU); // 类别文件一行一个名字行号即类别 ID std::ifstream ifs(samples/data/dnn/object_detection_classes_coco.txt); std::string line; while (std::getline(ifs, line)) classes.push_back(line);模型本身可以用官方脚本 samples/dnn/download_models.py 下载各模型的别名、输入尺寸、缩放系数都写在 samples/dnn/models.yml 里。例如 YOLOv8 系列统一为 640×640 输入、scale 0.00392后处理标记为yolov8。写好后用g -o yolo_detection yolo_detection.cpp \pkg-config --cflags --libs opencv4 编译然后运行即可。之后每帧要做的三件事是下面一节的内容。关键实现拆解 ⚙️预处理先把图像裁成标准尺寸模型只接受固定尺寸、固定数值范围的张量好比递图进检测窗口前先裁成标准规格、统一曝光。OpenCV 用一个函数一次完成缩放、尺寸调整、通道转换Mat blob blobFromImage(frame, 1.0/255.0, Size(640, 640), Scalar(0, 0, 0), true, false); net.setInput(blob);其中 scale 为 1/255把像素从 0~255 缩到 0~1Size(640, 640)是模型输入尺寸mean 是各通道要减去的均值YOLO 系列全为 0swapRBtrue把 BGR 换成 RGB因为 OpenCV 读图默认 BGR。输出解析从数值表还原出边界框net.forward(outs, net.getUnconnectedOutLayersNames())执行推理后得到一组 Mat 输出。以 YOLOX 格式为例每一行是一个候选框前 4 列是中心 x、中心 y、宽、高归一化值第 5 列起依次是各类别的置信度。float* data (float*)outs[i].data; for (int j 0; j outs[i].rows; j, data outs[i].cols) { Mat scores outs[i].row(j).colRange(5, outs[i].cols); Point classIdPoint; double confidence; minMaxLoc(scores, 0, confidence, 0, classIdPoint); if (confidence confThreshold) { int cx data[0]*frame.cols, cy data[1]*frame.rows; int w data[2]*frame.cols, h data[3]*frame.rows; boxes.push_back(Rect(cx - w/2, cy - h/2, w, h)); classIds.push_back(classIdPoint.x); confidences.push_back((float)confidence); } }minMaxLoc在一行里找出最大值和它的位置最大值就是这个框的置信度列号正好是类别 ID。归一化的 4 个数要乘回图像宽高才变成像素坐标中心点 宽高再换算成绘图用的左上角 宽高Rect。NMS 与绘制清掉重复的框模型对同一个目标常吐出多个重叠框NMS非极大值抑制Non-Maximum Suppression的作用是按重叠程度只保留分数最高的那个std::vectorint indices; NMSBoxes(boxes, confidences, confThreshold, nmsThreshold, indices); for (size_t i 0; i indices.size(); i) { Rect box boxes[indices[i]]; drawPred(classIds[indices[i]], confidences[indices[i]], box.x, box.y, box.x box.width, box.y box.height, frame); }drawPred先用 rectangle 画框再用 putText 在框顶标类名: 置信度如果框顶贴着图像上边缘会把标签下移到可见处实现细节可看 samples/dnn/object_detection.cpp 里的同名函数。调优与避坑 这一节讲怎么提帧率以及最常见的三类翻车。选对模型档位追求帧率就上小模型YOLOv8-nano、YOLOX-s 这类轻量版推理明显更快。换 GPU 或降分辨率有显卡就在编译时开启 CUDA 支持设DNN_BACKEND_CUDADNN_TARGET_CUDA没有就把输入从 640×640 降到 416×416速度提升肉眼可见代价是小目标更容易漏检。异步推理官方示例的异步分支用net.forwardAsync()把采集和推理重叠执行见 samples/dnn/object_detection.cpp。常见问题对照现象先查什么模型加载失败路径是否正确OpenCV 是否编译时带了 ONNX 支持一帧都检不出来把 confThreshold 从 0.5 降到 0.3 验证链路确认图像真的读进来了框的位置错位后处理分支不匹配官方示例按 ssd / yolov4 / yolov5 / yolov8 分别解析换模型要选对分支两个阈值含义不同confThreshold默认 0.5决定保留多少框nmsThreshold默认 0.4决定重叠到什么程度算重复。延伸方向跑通框人之后自然的下一步结合 OpenCV 的跟踪 API 做多目标跟踪用自己的数据集训练 YOLO 模型推理流程原样复用部署到树莓派、Jetson 等边缘设备小模型 低输入分辨率起步加载—预处理—推理—解析—抑制这条五步链路就是用 OpenCV DNN 部署 YOLO 类模型的通用流水线官方示例代码和参数都已在 opencv 项目里备好照着抄就能跑。【免费下载链接】opencvOpen Source Computer Vision Library项目地址: https://gitcode.com/GitHub_Trending/opencv31/opencv创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表