基于opencv4.5的C++实现⼈脸检测模型测试
@[TOC]基于opencv4.5的C++实现⼈脸检测模型测试
opencv的库⽂件⾥⾃带了训练好的dnn⽹络模型,python环境下⼈脸检测对于⼤多数⼈来说确实简单。但是本⽂环境:QT下的opoencv4.5.1(最新版了),C++。本博⽂也正是主要解决新版本opencv⽹络模型测试配置问题。
假设你已经配置好开发环境了。
⾸先,
到H:\opencv\sources\samples\dnn\face_detector
记事本打开a4。把两个url标签下的⽂件下载下来。既得到两个⽂件:opencv_face_detector_uint8.pb (模型)opencv_face_detector.pbtxt(模型配置参数)。
rectangle函数opencv可将这俩⽂件存在原⽂件⾥
具体代码实现:
#include<opencv2/opencv.hpp>
#include<opencv2/core.hpp>
#include<opencv2/dnn.hpp>
void QuickDemo::face_dection_demo()
{
VideoCapture capture(0);//调⽤摄像头
Mat frame;
string root_dir ="H:/opencv/sources/samples/dnn/face_detector/";
dnn::Net net = dnn::readNetFromTensorflow(root_dir+"opencv_face_detector_uint8.pb",root_dir+"opencv_face_detector.pbtxt");//读取模型和配置参数
while(true)
{
pty()==1)
{
break;
}
flip(frame,frame,1);
//准备数据
//1.0表⽰图像的⾊彩好保存在0到255之间;⼀些参数保存在l中。两个false不需要rgb的转换也不需要剪切
Mat blob = dnn::blobFromImage(frame,1.0,Size(300,300),Scalar(104,177,123),false,false);
//blob 结果是NCHW。N是多少个,C通道数,H⾼度,W宽度
net.setInput(blob);//将数据读⼊模型中
Mat probs = net.forward();//输出的第⼀个纬度是有多少图像,每个图像的index;
//第⼆纬度,图像是第⼏个批次的,第⼏张图的;
//第三个纬度表⽰有多少个框;第四个纬度,每个框有七个值,前两个是类型和dst,第三个是得分,最后四个是矩形的左上⾓和右上⾓
Mat detectionMat(probs.size[2],probs.size[3],CV_32F,probs.ptr());
//解析结果
for(int i =0; i < ws;i ++)
{
//得分
float confidence = detectionMat.at<float>(i,2);
if(confidence >0.6)
{
int x1 =static_cast<int>(detectionMat.at<float>(i,3)*ls);
//再乘以⼀个宽度才能变为真实的
int y1 =static_cast<int>(detectionMat.at<float>(i,4)*ws);
int x2 =static_cast<int>(detectionMat.at<float>(i,5)*ls);
int y2 =static_cast<int>(detectionMat.at<float>(i,6)*ws);
Rect rect(x1,y1,x2-x1,y2-y1);
rectangle(frame,rect,Scalar(255,0,0),2,8,0);
}
}
imshow("frame",frame);
char c =waitKey(1);
if(c =='0')
{
break;
}
}
}
在main函数中。直接调⽤这个函数即可。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论