目录
环境配置
头文件-quickopencv.h
源文件-quickdemo.cpp
1.dnn::readNetFromTensorflow()
2. dnn::blobFromImage()
3. Mat detectionMat
源文件-test.cpp
环境配置
visual studio2019配置opencv(详细教程) - 知乎 (zhihu.com)
以下代码来自B站贾志刚老师,直接运行不通,做了小小小修改
030 - 案例:实时人脸检测_哔哩哔哩_bilibili
头文件-quickopencv.h
1
2
3
4
5
6
7
8
9#pragma once #include <opencv2/opencv.hpp> using namespace cv; class QuickDemo { public: void face_detection_demo(); };
源文件-quickdemo.cpp
写完发现这一篇写的很好,概括我了(42条消息) opencv---关于DNN的若干学习笔记_夜雨_小学徒的博客-CSDN博客_opencv的dnn
1.dnn::readNetFromTensorflow()
模型导入与加载的相关API支持以下深度学习框架:
- tensorflow - readNetFromTensorflow
- caffe - readNetFromCaffe
- pytorch - readNetFromTorch
- darknet - readNetFromDarknet
本次代码调用的tensorflow框架:
cv2::dnn::readNetFromTensorflow(pbmodel, pbtxt)
函数直接调用 TensorFlow 训练的目标检测模型.
2. dnn::blobFromImage()
摘自:(42条消息) cv2.dnn.blobFromImage()函数用法_田土豆的博客-CSDN博客_blobfromimage
函数:cv2::dnn::blobFromImage(image, scalefactor, size, mean, swapRB, crop, ddepth)
作用:
输入图像转换为模型的标准输入,对图像进行预处理,包括减均值,比例缩放,裁剪,交换通道等,返回一个4通道的blob(blob可以简单理解为一个N维的数组,用于神经网络的输入)
参数:
image:输入图像(1、3或者4通道)
可选参数
scalefactor:图像各通道数值的缩放比例
size:输出图像的空间尺寸,如size=(200,300)表示高h=300,宽w=200
mean:用于各通道减去的值,以降低光照的影响(e.g. image为bgr3通道的图像,mean=[104.0, 177.0, 123.0],表示b通道的值-104,g-177,r-123)
swapRB:交换RB通道,默认为False.(cv2.imread读取的是彩图是bgr通道)
crop:图像裁剪,默认为False.当值为True时,先按比例缩放,然后从中心裁剪成size尺寸
ddepth:输出的图像深度,可选CV_32F 或者 CV_8U.
3. Mat detectionMat
Mat detectionMat是输入图像后经过网络前向传播后的输出的结果矩阵,
如果对象检测网络是SSD/RCNN/Faster-RCNN,输出的是N*7模式,所以其解析方式如下
Mat detectionMat(out.size[2],out.size[3],CV_32F,out.ptr<float>())
其中7表示七列输出,第一列表示下标,第二列表示分类标签,第三列表示置信度,第四列至第七列表示box的坐标位置。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42#include "quickopencv.h" #include <opencv2/dnn.hpp> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; void QuickDemo::face_detection_demo() { dnn::Net net = dnn::readNetFromTensorflow("D:\opencv\opencv\sources\samples\dnn\face_detector\opencv_face_detector_uint8.pb", "D:\opencv\opencv\sources\samples\dnn\face_detector\opencv_face_detector.pbtxt"); VideoCapture capture("C:/Users/zhaoliuliu/Pictures/Camera Roll/test1.mp4"); Mat frame; while (true) { capture.read(frame); if (frame.empty()) { break; } Mat blob = dnn::blobFromImage(frame, 1.0, Size(300, 300), Scalar(104, 177, 123), false, false); net.setInput(blob);// NCHW Mat probs = net.forward(); // Mat detectionMat(probs.size[2], probs.size[3], CV_32F, probs.ptr<float>()); // 解析结果 for (int i = 0; i < detectionMat.rows; i++) { float confidence = detectionMat.at<float>(i, 2); if (confidence > 0.5) { int x1 = static_cast<int>(detectionMat.at<float>(i, 3) * frame.cols);//后面四列表示box的四个坐标位置 int y1 = static_cast<int>(detectionMat.at<float>(i, 4) * frame.rows);//坐标值是浮点数的比率,需要转换成像素坐标 int x2 = static_cast<int>(detectionMat.at<float>(i, 5) * frame.cols); int y2 = static_cast<int>(detectionMat.at<float>(i, 6) * frame.rows); Rect box(x1, y1, x2 - x1, y2 - y1); rectangle(frame, box, Scalar(0, 0, 255), 2, 8, 0); } } imshow("人脸检测演示", frame); int c = waitKey(1); if (c == 27) { // 退出 break; } } }
源文件-test.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#include <opencv2/opencv.hpp> #include "quickopencv.h" #include <iostream> using namespace cv; using namespace std; int main(int argc, char** argv) { QuickDemo qd; qd.face_detection_demo(); waitKey(0); destroyAllWindows(); return 0; }
结果
运行输出结果
最后
以上就是慈祥鞋子最近收集整理的关于opencv dnn(C++) 实时人脸检测的全部内容,更多相关opencv内容请搜索靠谱客的其他文章。
发表评论 取消回复