OpenCv dnn module -实时图像分类
配置环境:OpenCv3.4, vs2013(x64),Win7。
用OpenCv dnn module 实时检测摄像头,视频和图像的分类示例
原代码为:https://docs.opencv.org/3.4.0/da/d9d/tutorial_dnn_yolo.html,
https://github.com/pjreddie/darknet/tree/master/data,可以下载分类文件。根据不同的model,选择不同的names。
https://pjreddie.com/darknet/yolo/,可下载model的cfg文件和weights文件。
// Brief Sample of using OpenCV dnn module in real time with device capture, video and image. #include <opencv2/dnn.hpp>
#include <opencv2/dnn/shape_utils.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <fstream>
#include <iostream>
#include <algorithm>
#include <cstdlib> using namespace std;
using namespace cv;
using namespace cv::dnn; static const char* about =
"This sample uses You only look once (YOLO)-Detector (https://arxiv.org/abs/1612.08242) to detect objects on camera/video/image.\n"
"Models can be downloaded here: https://pjreddie.com/darknet/yolo/\n"
"Default network is 416x416.\n"
"Class names can be downloaded here: https://github.com/pjreddie/darknet/tree/master/data\n"; static const char* params =
"{ help | false | print usage }"
"{ cfg | model_cfg/yolo.cfg | model configuration }" //模型配置文件
"{ model | model_weights/yolo.weights | model weights }" //模型权重文件
"{ camera_device | 0 | camera device number}" //摄像头
"{ source | pic/person.jpg | video or image for detection}" 图片路径
"{ save | | file name output}" //可设置保存文件路径
"{ fps | 3 | frame per second }"
"{ style | box | box or line style draw }"
"{ min_confidence | 0.24 | min confidence }" //最小置信阀值
"{ class_names | names/coco.names | File with class names, [PATH-TO-DARKNET]/data/coco.names }"; //分类文件 int main(int argc, char** argv)
{
CommandLineParser parser(argc, argv, params); if (parser.get<bool>("help"))
{
cout << about << endl;
parser.printMessage();
return ;
} String modelConfiguration = parser.get<String>("cfg");
String modelBinary = parser.get<String>("model"); dnn::Net net;
try {
//! [Initialize network]
net = readNetFromDarknet(modelConfiguration, modelBinary);
//! [Initialize network]
}
catch (cv::Exception& e) {
std::cerr << "Exception: " << e.what() << std::endl;
if (net.empty())
{
cerr << "Can't load network by using the following files: " << endl;
cerr << "cfg-file: " << modelConfiguration << endl;
cerr << "weights-file: " << modelBinary << endl;
cerr << "Models can be downloaded here:" << endl;
cerr << "https://pjreddie.com/darknet/yolo/" << endl;
exit(-);
}
} VideoCapture cap;
VideoWriter writer;
int codec = CV_FOURCC('M', 'J', 'P', 'G');
double fps = parser.get<float>("fps");
if (parser.get<String>("source").empty())
{
int cameraDevice = parser.get<int>("camera_device");
cap = VideoCapture(cameraDevice);
if (!cap.isOpened())
{
cout << "Couldn't find camera: " << cameraDevice << endl;
return -;
}
}
else
{
cap.open(parser.get<String>("source"));
if (!cap.isOpened())
{
cout << "Couldn't open image or video: " << parser.get<String>("video") << endl;
return -;
}
} if (!parser.get<String>("save").empty())
{
writer.open(parser.get<String>("save"), codec, fps, Size((int)cap.get(CAP_PROP_FRAME_WIDTH), (int)cap.get(CAP_PROP_FRAME_HEIGHT)), );
} vector<String> classNamesVec;
ifstream classNamesFile(parser.get<String>("class_names").c_str());
if (classNamesFile.is_open())
{
string className = "";
while (std::getline(classNamesFile, className))
classNamesVec.push_back(className);
} String object_roi_style = parser.get<String>("style"); for (;;)
{
Mat frame;
cap >> frame; // get a new frame from camera/video or read image if (frame.empty())
{
waitKey();
break;
} if (frame.channels() == )
cvtColor(frame, frame, COLOR_BGRA2BGR); //! [Prepare blob]
Mat inputBlob = blobFromImage(frame, / .F, Size(, ), Scalar(), true, false); //Convert Mat to batch of images
//! [Prepare blob] //! [Set input blob]
net.setInput(inputBlob, "data"); //set the network input
//! [Set input blob] //! [Make forward pass]
Mat detectionMat = net.forward("detection_out"); //compute output
//! [Make forward pass] vector<double> layersTimings;
double tick_freq = getTickFrequency();
double time_ms = net.getPerfProfile(layersTimings) / tick_freq * ;
putText(frame, format("FPS: %.2f ; time: %.2f ms", .f / time_ms, time_ms),
Point(, ), , 0.5, Scalar(, , )); float confidenceThreshold = parser.get<float>("min_confidence");
for (int i = ; i < detectionMat.rows; i++)
{
const int probability_index = ;
const int probability_size = detectionMat.cols - probability_index;
float *prob_array_ptr = &detectionMat.at<float>(i, probability_index); size_t objectClass = max_element(prob_array_ptr, prob_array_ptr + probability_size) - prob_array_ptr;
float confidence = detectionMat.at<float>(i, (int)objectClass + probability_index); if (confidence > confidenceThreshold)
{
float x_center = detectionMat.at<float>(i, ) * frame.cols;
float y_center = detectionMat.at<float>(i, ) * frame.rows;
float width = detectionMat.at<float>(i, ) * frame.cols;
float height = detectionMat.at<float>(i, ) * frame.rows;
Point p1(cvRound(x_center - width / ), cvRound(y_center - height / ));
Point p2(cvRound(x_center + width / ), cvRound(y_center + height / ));
Rect object(p1, p2); Scalar object_roi_color(, , ); if (object_roi_style == "box")
{
rectangle(frame, object, object_roi_color);
}
else
{
Point p_center(cvRound(x_center), cvRound(y_center));
line(frame, object.tl(), p_center, object_roi_color, );
} String className = objectClass < classNamesVec.size() ? classNamesVec[objectClass] : cv::format("unknown(%d)", objectClass);
String label = format("%s: %.2f", className.c_str(), confidence);
int baseLine = ;
Size labelSize = getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, , &baseLine);
rectangle(frame, Rect(p1, Size(labelSize.width, labelSize.height + baseLine)),
object_roi_color, CV_FILLED);
putText(frame, label, p1 + Point(, labelSize.height),
FONT_HERSHEY_SIMPLEX, 0.5, Scalar(, , ));
}
}
if (writer.isOpened())
{
writer.write(frame);
} imshow("YOLO: Detections", frame);
if (waitKey() >= ) break;
} return ;
} // main
OpenCv dnn module -实时图像分类的更多相关文章
- 手把手教你使用LabVIEW OpenCV dnn实现图像分类(含源码)
@ 目录 前言 一.什么是图像分类? 1.图像分类的概念 2.MobileNet简介 二.使用python实现图像分类(py_to_py_ssd_mobilenet.py) 1.获取预训练模型 2.使 ...
- 基于Tensorflow + Opencv 实现CNN自定义图像分类
摘要:本篇文章主要通过Tensorflow+Opencv实现CNN自定义图像分类案例,它能解决我们现实论文或实践中的图像分类问题,并与机器学习的图像分类算法进行对比实验. 本文分享自华为云社区< ...
- 手把手教你使用LabVIEW OpenCV DNN实现手写数字识别(含源码)
@ 目录 前言 一.OpenCV DNN模块 1.OpenCV DNN简介 2.LabVIEW中DNN模块函数 二.TensorFlow pb文件的生成和调用 1.TensorFlow2 Keras模 ...
- opencv读取摄像头实时流代码
opencv读取摄像头实时流代码: #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; ...
- [Android Studio] Using API of OpenCV DNN
前言 一.故事背景 NDK方法人脸识别 OpenCV4Android系列: 1. OpenCV4Android开发实录(1):移植OpenCV3.3.0库到Android Studio 2.OpenC ...
- opencv中的SVM图像分类(二)
opencv中的SVM图像分类(二) 标签: svm图像 2015-07-30 08:45 8296人阅读 评论(35) 收藏 举报 分类: [opencv应用](5) 版权声明:本文为博主原创文 ...
- OpenCv dnn模块扩展研究(1)--style transfer
一.opencv的示例模型文件 使用Torch模型[OpenCV对各种模型兼容并包,起到胶水作用], 下载地址: fast_neural_style_eccv16_starry_night.t7 ...
- OpenCV开发笔记(七十三):红胖子8分钟带你使用opencv+dnn+yolov3识别物体
前言 级联分类器的效果并不是很好,准确度相对深度学习较低,上一章节使用了dnn中的tensorflow,本章使用yolov3模型,识别出具体的分类. Demo 320x320,置信度0 ...
- tensorflow下基于DNN实现实时分辨人脸微表情
参加学校的国创比赛的时候,我们小组的项目有一部分内容需要用到利用摄像头实现实时检测人脸的表情,因为最近都在看深度学习方面的相关知识,所以就自己动手实现了一下这个小Demo.参考网上的资料,发现大部分是 ...
随机推荐
- JavaScript---详解scroll
scroll scroll--译为‘滚动’,他是非常常用的属性. 滚动宽高 scrollHeight scrollHeight表示元素的总高度,包括由于溢出而无法展示在网页的不可见部分(不要误解为只有 ...
- C# 对json对象嵌套数组
看图: 这里可以看到是二层嵌套!!使用C#如何实现?? 思路:使用list集合实现 → 建立类 → list集合 → 微软的 Newtonsoft.Json (一款.NET中开源的Json序列化 ...
- windows下查看端口是否被占,以及端口被哪个程序占用
如何查看端口被是否被占用 在 “ 命令提示符 ” 中输入 “netstat -an”, 即可显示本机所有开放端口.下表是具体的说明. 数据列 说明 propo 指连接使用的协议名称 local add ...
- 每天一个linux命令(网络):【转载】route命令
Linux系统的route命令用于显示和操作IP路由表(show / manipulate the IP routing table).要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或 ...
- WPF 多线程 UI:设计一个异步加载 UI 的容器
对于 WPF 程序,如果你有某一个 UI 控件非常复杂,很有可能会卡住主 UI,给用户软件很卡的感受.但如果此时能有一个加载动画,那么就不会感受到那么卡顿了.UI 的卡住不同于 IO 操作或者密集的 ...
- 线上服务器TCP被打满是啥情况
从一个线上服务器警告谈谈backlog https://wangxiangnan.cc/?p=105 缘起 双十一如期而至,此时的我因为在处理客户的一个问题已经陷入了忙碌.突然,不断接到驻场实施发来的 ...
- 2018-2019-2 《网络对抗技术》Exp2 后门原理与实践 20165222
Exp2 后门原理与实践 实验环境 win7ip地址为: 192.168.136.130 kali.ip地址为: 192.168.136.129 两台虚拟机可以ping通 实验步骤 1,使用netca ...
- Mysql5.6 buffer_pool预热功能
通常在mysql重启服务后,需要通过手工执行SQL来预热buffer_pool,在mysql5.6中,有如下参数可以无需人工干预. innodb_buffer_pool_dump_at_shutdow ...
- Jmeter二次开发之代码环境搭建(QQ交流群:577439379)
一.创建项目 1. 分别下载apache3.1 binaries和source两个压缩包,前者为release版本,后者为jmeter最新的源码,下载地址:http://jmeter.apache.o ...
- 关于_WIN32_WINNT的含义
在使用一些新版本的API,或者控件的新特性(比如新版的ComCtl32.dll)的时候,你可能会得到“error C2065: undeclared identifier.“这个错误.原因是这些功能是 ...