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.参考网上的资料,发现大部分是 ...
随机推荐
- C#中as和is关键字
一. as 运算符用于在兼容的引用类型之间执行某些类型的转换.例如: static void Main(string[] args) { ]; obj[] = new class1(); obj[] ...
- Cookie是什么?从哪来?存在哪?往哪去?
什么是cookie? cookie最简单的介绍就是服务器返回的一个字符串信息,只不过我们每次请求都需要把它发送给服务器.以AFN和android-async-http为例子,默认都会把cookie自动 ...
- 转载:【Oracle 集群】RAC知识图文详细教程(八)--Oracle 11G RAC数据库安装
文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...
- IIS经典模式与集成模式
在IIS7.0中Web应用程序有两种配置形式:经典和集成 经典模式 经典模式是为了与之前的版本兼容,使用ISAPI扩展来调用ASP.NET运行库,原先运行于IIS6.0下的Web应用程序迁移到IIS7 ...
- CNN中卷积层的计算细节
原文链接: https://zhuanlan.zhihu.com/p/29119239 卷积层尺寸的计算原理 输入矩阵格式:四个维度,依次为:样本数.图像高度.图像宽度.图像通道数 输出矩阵格式:与输 ...
- HDU 2154:跳舞毯
跳舞毯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- .NET CORE微服务实践
.NET CORE微服务实践 https://www.cnblogs.com/zengqinglei/p/9570343.html .NET CORE 实践部署架构图 实践源码:https://git ...
- Keep On Movin
上回书说道不愿透露姓名的巨巨还剩下一个数组,这个数组记录了他学习c++ 语言的过程. 现在这个数组a里有一些字符,第i个字符的数量是a[i].巨巨想用这些字符来构造一些回文串好让他的程序通过编译. 他 ...
- Java编程之Date的相关操作
一:讲字符串的时间格式数据转换成时间对象 //将字符串的时间数据,转换成时间 String dateString="2007-12-12"; DateFormat date=new ...
- (考研)PV操作和信号量
就绪:除了CPU其他都行了 进程的阻塞:进程因等待某事件(如等待I/O设备,等待临街资源)而暂时不能运行的状态,此时即使处理机空闲,进程也无法使用. ************************* ...