1、概述
案例:使用opencv级联分类器CascadeClassifier+其提供的特征数据实现人脸检测,检测到人脸后使用红框画出来。
API介绍:
detectMultiScale( InputArray image,
CV_OUT std::vector<Rect>& objects,double scaleFactor = 1.1,
int minNeighbors = 3, int flags = 0,
Size minSize = Size(),
Size maxSize = Size(),
);
image:输入图像
objects:检测到的目标区域数组(因一副图像中有可能有多个人脸)
scaleFactor:搜索前后两次窗口大小比例系数,默认为1:1,即每次搜索窗口扩大10%
minNeighbors:构成检测目标的相邻矩形的最小个数 如果组成检测目标的小矩形的个数和小于minneighbors - 1 都会被排除,如果minneighbors为0 则函数不做任何操作就返回所有被检候选矩形框。
flags:若设置为CV_HAAR_DO_CANNY_PRUNING 函数将会使用Canny边缘检测来排除边缘过多或过少的区域,默认写0即可
minSize:检测的最小尺寸
maxSize:检测的最大尺寸
实现人脸检测的步骤:
1.实例化CascadeClassifier face_cascade
2.使用load加载特征数据
3.载入待检测图像
4.图像灰度化
5.将灰度图进行直方图均衡化
6.进行多尺度检测,并输出检测到的人脸区域候选数组
7.将人脸区域数组绘制并显示到原图输出
2、代码示例
//加载特征数据
CascadeClassifier face_cascade;
if(!face_cascade.load(xmlPath.toStdString())){
qDebug()<<"不能加载特征数据";
return;
}
Mat src = imread(filePath);
if(src.empty()){
qDebug()<<"图片不能为空";
return;
}
imshow("src",src);
Mat gray;
cvtColor(src,gray,COLOR_BGR2GRAY);
//进行直方图均衡化
equalizeHist(gray,gray);
// imshow("equalizHist",gray);
//执行多尺度特征检测
vector<Rect> faces;
face_cascade.detectMultiScale(gray,faces,1.1,minTargetRectCount,0,Size(24,24));
for(size_t i = 0;i<faces.size();i++){
rectangle(src,faces[i],Scalar(0,0,255),2,LINE_8,0);
}
imshow("result",src);
3、示例图片
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓