OpenCV3.4调用YOLOv3模型完成目标检测

您所在的位置:网站首页 yolov3官方文档 OpenCV3.4调用YOLOv3模型完成目标检测

OpenCV3.4调用YOLOv3模型完成目标检测

2023-01-22 04:25| 来源: 网络整理| 查看: 265

这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战」

一、前言

OpenCV是开源的计算机视觉库,支持跨平台,本身虽然是C,C++编写,也提供了其他语言的调用接口,比如: python等等。 下载OpenCV后,可以使用OpenCV本身自带的模型,体验人脸、猫脸、人体、眼睛、鼻子等检测功能,效率也还是比较高的。这篇文章主要是介绍OpenCV如何调用YOLOv3的模型完成目标检测,YOLO的目标检测是非常强大的,YOLOV3自带的模型本身可以完成80多种目标检测,而且精度还不错。

下面是调用YOLO模型检测效果:

image.png image.png

image.png

image.png

当前的环境介绍:

OpenCV版本: 3.4.7 minGW 32位版本。

(第二章提供例子代码使用opencv官方的x64库,运行崩溃,MSVC编译器需要对应OpenCV的版本才行)

YOLO 版本: YOLOv3

使用的YOLO模型: YOLOv3 官方自带模型。

YOLOv4的模型,OpenCV3.x无法调用,需要用到OpenCV4.2以上的版本。

YOLOv3的模型文件直接去YOLO官网就能下载,OpenCV调用YOLO需要用到以下3个文件:

coco.names yolov3.cfg yolov3.weights 复制代码

YOLO的官方地址: pjreddie.com/darknet/yol…

image.png 其中yolov3.cfg、yolov3.weights 可以直接在官网介绍里找到下载地址。 coco.names 没有下载地址,我这里就直接把内容贴出来:

person bicycle car motorbike aeroplane 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 sofa pottedplant bed diningtable toilet tvmonitor laptop mouse remote keyboard cell phone microwave oven toaster sink refrigerator book clock vase scissors teddy bear hair drier toothbrush 复制代码 二、示例代码

函数声明:

//YOLOv3目标检测 void yolo_Handle(QImage LoadImage); void postprocess(Mat& frame, const vector& outs, float confThreshold, float nmsThreshold); void drawPred(int classId, float conf, int left, int top, int right, int bottom, Mat& frame); vector getOutputsNames(Net&net); 复制代码

核心代码

vector ImageHandle::getOutputsNames(Net&net) { static vector names; if (names.empty()) { vector outLayers = net.getUnconnectedOutLayers(); vector layersNames = net.getLayerNames(); names.resize(outLayers.size()); for (size_t i = 0; i < outLayers.size(); ++i) names[i] = layersNames[outLayers[i] - 1]; } return names; } //处理图片,在图片上绘制矩形框 //其中传入的参数解释: //conf 目标在图片里x坐标位置 //left 目标在图片里y坐标位置 //right 目标在图片里的宽度 //bottom 目标在图片里的高度 //这个就是识别的目标物体在图片里的矩形尺寸 void ImageHandle::drawPred(int classId, float conf, int left, int top, int right, int bottom, Mat& frame) { //绘制一个显示边框的矩形 rectangle(frame, Point(left, top), Point(right, bottom), Scalar(255, 178, 50), 3); //获取识别到标签类名及其识别度(可信度)的标签,可信度的范围是0~1.0 越大表示目标越准确 string label = format("%.5f", conf); if (!classes.empty()) { CV_Assert(classId < (int)classes.size()); label = classes[classId] + ":" + label; } else { qDebug()


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3