环境:VS2017+opencv3.3+C++
刚刚做人脸年龄和性别预测的时候,使用到了级联检测器,在这里简单讲一下!
首先我们应该应该准备一些东西,我用的是opencv3.3 版本,opencv中封装好了级联分类器的特征文件(xml文件),我的目录是D:\new_cv\opencv\sources\data\haarcascades,里面有很多的预训练模型,供大家使用,
其中包含了猫脸识别,人眼识别,以及我要讲的demo人脸识别haarcascade_frontalface_alt_tree.xml,除此以外还需要准备一张备用的人脸图片,常见的jpg和png格式,opencv都是支持的。接下来,就可以开始搞事情啦,哈哈哈~
#include
#include
#include
using namespace std;
using namespace cv;
using namespace cv::dnn;
Mat src = imread("D:/test/test.jpg");
if (src.empty())
{
cout << "src is empty" << endl;
return -1;
}
imshow("src", src);
waitKey(0);
return 0;
嘿嘿,又用了美女的照片~ ^_^
cascader.detectMultiScale参数说明:
void detectMultiScale(
const Mat& image, //待检测灰度图像
CV_OUT vector& objects, //被检测物体的矩形框向量
double scaleFactor = 1.1, //前后两次相继的扫描中搜索窗口的比例系数,默认为1.1 即每次搜索窗口扩大10%
int minNeighbors = 3, //构成检测目标的相邻矩形的最小个数 如果组成检测目标的小矩形的个数和小于minneighbors - 1 都会被排除
//如果minneighbors为0 则函数不做任何操作就返回所有被检候选矩形框
int flags = 0, //若设置为CV_HAAR_DO_CANNY_PRUNING 函数将会使用Canny边缘检测来排除边缘过多或过少的区域
Size minSize = Size(),
Size maxSize = Size() //最后两个参数用来限制得到的目标区域的范围
);
级联检测部分:
CascadeClassifier cascader;//声明级联对象
cascader.load(case_file);
if (cascader.empty())
{
cout << "load error" << endl;
return -1;
}
vector res;//级联返回的是坐标对象
Mat gray;//使用灰度图像进行检测
cvtColor(src, gray, CV_RGB2GRAY);//获取灰度图像
imshow("gray", gray);
equalizeHist(gray, gray);
cascader.detectMultiScale(gray, res, 1.02, 1, 0, Size(27, 27));
cout << res.size() << endl;
for (size_t t = 0; t < res.size(); t++)
{
rectangle(src, res[t], Scalar(1, 1, 2), 1, 8, 0);
}
imshow("detection result", src);
嘿嘿:最后我们就能看到结果啦!
源代码:https://github.com/haiqiang2017/open-dnn/blob/master/DNN/net_cas.cpp
坚持一件事情,或许很难,但坚持下来一定很酷!^_^