一、概述
案例:使用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.将人脸区域数组绘制并显示到原图输出
二、代码示例
//加载特征数据 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);
三、示例图片