概述
检测视频中的人脸,实际上就是读取每一帧画面,然后对每一帧画面进行人脸检测,绘制矩形框,循环操作,直到视频结束。
关于视频的读取,可以参照:
Qt-OpenCV学习笔记--读取视频--VideoCapture()
关于人脸的识别,可以参照:
Qt-OpenCV学习笔记--人脸识别--基于Haar特征的cascade分类器
测试代码
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//创建级联分类器
CascadeClassifier cascade;
//载入Haar特征分类器
cascade.load("C:/opencv/date/haarcascade_frontalface_alt2.xml");
//载入视频路径
VideoCapture capture("c:/opencv/zhou.mp4");
//新建图像
Mat frame;
//循环读取
while (1)
{
//读取当前帧(再次读取时,Mat自动释放,获取下一帧图像)
capture>>frame;
//播放完毕,跳出循环
if(frame.empty())
{
qDebug()<<"播放完毕!";
break;
}
//生成灰度图
Mat dst_gray;
cvtColor(frame, dst_gray, COLOR_BGR2GRAY);
//创建矩形容器
vector<Rect> rects;
//识别人脸
cascade.detectMultiScale(dst_gray,rects,1.1,3,0);
//绘制矩形框
Scalar color(0,255,0);
for(uint i=0;i<rects.size();i++)
{
rectangle(frame,rects[i],color,2,8);
}
//图像显示
imshow("frame",frame);
//延时,读取下一帧视频
waitKey(5);
}
}
Widget::~Widget()
{
delete ui;
}