概述
基于Haar特征的cascade分类器(classifiers) 是Paul Viola和 Michael Jone在2001年,论文”Rapid Object Detection using a Boosted Cascade of Simple Features”中提出的一种有效的物品检测(object detect)方法。它是一种机器学习方法,通过许多正负样例中训练得到cascade方程,然后将其应用于其他图片。
Haar特征分类器就是一个XML文件,该文件中会描述人体各个部位的Haar特征值。
OpenCV自带一些已经训练好的分类器,比如人脸、眼睛、微笑等。这些文件储存在如下路径中:
opencv/data/haarcascades/
如果想要自己训练分类器,来识别任意物品,可以参照:
Cascade Classifier Training
函数
void cv::CascadeClassifier::detectMultiScale
(
InputArray image,
std::vector< Rect > & objects,
double scaleFactor = 1.1,
int minNeighbors = 3,
int flags = 0,
Size minSize = Size(),
Size maxSize = Size()
)
image | 输入图像(CV_8U) |
objects | 输出结果(包含人脸位置的矩形集合) |
scaleFactor | 每次图像缩小的比例(默认1.1) |
minNeighbors | 成功匹配所需要的矩形框的数量(默认为3) |
flags | 默认为0 ● CASCADE_DO_CANNY_PRUNING=1 利用canny边缘检测来排除一些边缘很少或者很多的图像区域 |
minSize | 最小对象尺寸(小于该值的对象将被忽略) |
maxSize | 最大对象尺寸(大于该值的对象将被忽略) |
测试代码
#include "widget.h"
#include "ui_widget.h"
#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");
//创建矩阵
Mat src,
dst_gray;
//载入图像
src = imread("c:/opencv/zhou.jpg");
//生成灰度图
cvtColor(src, 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(src,rects[i],color,2,8);
}
//显示
imshow("src",src);
}
Widget::~Widget()
{
delete ui;
}
测试结果
参考:
opencv人脸检测_Haar特征分类器实现人脸检测_cascade.detectMultiScale参数详解
使用Haar Cascade 进行人脸识别