OpenCV--级联分类器HAAR的使用

      环境:VS2017+opencv3.3+C++

     刚刚做人脸年龄和性别预测的时候,使用到了级联检测器,在这里简单讲一下!

1、数据准备

    首先我们应该应该准备一些东西,我用的是opencv3.3 版本,opencv中封装好了级联分类器的特征文件(xml文件),我的目录是D:\new_cv\opencv\sources\data\haarcascades,里面有很多的预训练模型,供大家使用,

OpenCV--级联分类器HAAR的使用_第1张图片

        其中包含了猫脸识别,人眼识别,以及我要讲的demo人脸识别haarcascade_frontalface_alt_tree.xml,除此以外还需要准备一张备用的人脸图片,常见的jpg和png格式,opencv都是支持的。接下来,就可以开始搞事情啦,哈哈哈~

2、加载头文件

#include 
#include
#include
using namespace std;
using namespace cv;
using namespace cv::dnn;

3、输入待测图片

	Mat src = imread("D:/test/test.jpg");
	if (src.empty())
	{
		cout << "src is empty" << endl;
		return -1;
	}
	imshow("src", src);
	waitKey(0);
	return 0;

嘿嘿,又用了美女的照片~   ^_^

     OpenCV--级联分类器HAAR的使用_第2张图片

4、加载级联分类器

    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);

嘿嘿:最后我们就能看到结果啦!

OpenCV--级联分类器HAAR的使用_第3张图片

源代码:https://github.com/haiqiang2017/open-dnn/blob/master/DNN/net_cas.cpp

 坚持一件事情,或许很难,但坚持下来一定很酷!^_^

你可能感兴趣的:(C++,opencv,opencv的入门与实践)