Qt+OpenCV联合开发(二十九)--实时人脸检测案例
Posted hml111666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt+OpenCV联合开发(二十九)--实时人脸检测案例相关的知识,希望对你有一定的参考价值。
一、准备工作
1、下载人脸检测用到的库文件,包括Tensorflow模型以及配置文件,如图,库文件可以放在任意位置
2、加入头文件
二、函数原型
1、readNetFromTensorflow函数
作用:读取Tensorflow模型以及配置文件
c++原型:
参数:
- model: Tensorflow模型文件(.pb文件)
- config: Tensorflow配置文件(.pbtxt文件)
返回值:读到的dnn::Net类型的网络文件
2、blobFromImage函数
作用:主要是用来对图片进行预处理
c++原型:
参数:
- image: 输入图像
- scalefactor:当我们将图片减去平均值之后,还可以对剩下的像素值进行一定的尺度缩放,默认值是1.0。如果希望减去平均像素之后的值,全部缩小一半,那么可以将scalefactor设为0.5。
- size:是我们神经网络在训练的时候要求输入的图片尺寸
- mean:需要将图片整体减去的平均值,如果我们需要对RGB图片的三个通道分别减去不同的值,那么可以使用3组平均值,如果只使用一组,那么就默认对三个通道减去一样的值。
- swapRB:是否要进行RB两个通道的交换,默认false。OpenCV中认为我们的图片通道顺序是BGR,但是我平均值假设的顺序是RGB,所以如果需要交换R和G,那么就为true
- crop:是否要进行剪切,默认false
补充参数mean:
减去平均值为了消除同一场景下不同光照的图片,对我们最终的分类或者神经网络的影响,我们常常对图片的R、G、B通道的像素求一个平均值,然后将每个像素值减去我们的平均值,这样就可以得到像素之间的相对值,就可以排除光照的影响。
三、实现思路及效果
1、思路
- 读取Tensorflow模型以及配置文件
- 加载并读取视频
- 对图片进行预处理
- 把预处理完的数据(NCHW)input到Tensorflow网络模型中去推理
- 获取推理后的数据并重新构建Mat图像
- 解析结果(绘制矩形)
- 显示图像
2、效果
2.1读取摄像头:实时人脸检测
2.2读取视频,打开以下视频查看(已上传至优酷)
四、代码
void test1::detect_face()
String root_dir = "E:/qt-zqw/qt-workplace/opencvDemo1/face_detector/";
//读取Tensorflow模型以及配置文件
dnn::Net net = dnn::readNetFromTensorflow(root_dir+"opencv_face_detector_uint8.pb",root_dir+"opencv_face_detector.pbtxt");//读取深度学习Tensorflow模型
VideoCapture capture("E:/images/images/example_dsh.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);//blob就是 NCHW 多少个 通道数 高度 宽度
//获取数据
Mat probs = net.forward();//获取推理后的数据
Mat detectionMat(probs.size[2],probs.size[3],CV_32F,probs.ptr<float>());//构建Mat图像
//解析结果
for(int i=0;i<detectionMat.rows;i++)
float con = detectionMat.at<float>(i,2);
if(con>0.5)//大于0.5就是人脸
//获取矩形坐标(第3,4,5,6参数)
int x1 = static_cast<int>(detectionMat.at<float>(i,3)*frame.cols);
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("detect_face",frame);
int c = waitKey(1);
if(c ==27)
break;
VideoCapture capture("E:/images/images/example_dsh.mp4");把参数换成0即为读取摄像头
原创不易,转载请注明出处:
以上是关于Qt+OpenCV联合开发(二十九)--实时人脸检测案例的主要内容,如果未能解决你的问题,请参考以下文章