基于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/
如果想要自己训练分类器,来识别任意物品,可以参照:
- 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;
- }
