OpenCV之图像特征提取与检测(十九) 级联分类器 – 人脸检测

在opencv编译目录(./etc/haarcascades,android平台的库也有./OpenCV-android-sdk/sdk/etc/haarcascades)下有Haar训练好了的数据,包括眼睛,人脸等
(./etc/lbpcascades 下的是LBP特征的训练数据(xml大小比Haar特征的要小很多))

检测基本原理(Haar与LBP特征)
这里写图片描述
1. 特征 = w1*(RectSum1)+w2*(RectSum2)
2. w1、 w2是权重,可以是正或者负数
3. 对每个像素点,每个尺度上做计算

弱分类器
这里写图片描述
级联检测器(cascade):通过弱分类器检测到的人脸再次进行多次弱分类器检测,最终得到的人脸检测结果的准确率就非常高了。
使用级联检测器前,需要有训练好的数据。
这里写图片描述

// 对象检测,检测的是什么对象由训练的数据决定
void CascadeClassifier::detectMultiScale( // 在不同尺度空间检测 输入图像中不同大小的对象。 检测到的对象作为矩形列表返回
    InputArray image, // 待检测的图像,CV_8U类型
    CV_OUT std::vector<Rect>& objects, // 保存检测到的对象
    double scaleFactor = 1.1, // 不同尺度空间之间的差距
    int minNeighbors = 3, // 表示构成检测目标的相邻矩形的最小个数(默认为3个)。如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除
    int flags = 0, 
    Size minSize = Size(), // 最小尺寸,小于这个尺寸的不检测,默认检测所有小尺寸
    Size maxSize = Size() // 最大尺寸,大于这个尺寸的不检测,默认检测所有大尺寸
);

代码

#include "../common/common.hpp"

void main(int argc, char** argv)
{
    // 训练好了的人脸数据
    String cascadeFilePath = "project/workspace_vs/OpenCV310Sources_contrib/install/etc/haarcascades/haarcascade_frontalface_alt_tree.xml";
    CascadeClassifier face_cascade; // 级联分类检测器
    if (!face_cascade.load(getCVImagesPath(cascadeFilePath))) // 加载训练的数据
    {
        printf("could not load haar data...\n");
    }
    Mat src, gray;
    src = imread(getCVImagesPath("images/fastrcnn.jpg"));
    cvtColor(src, gray, COLOR_BGR2GRAY);
    equalizeHist(gray, gray); // 直方图均衡化,提升对比度,提升图像特征提取的准确率
    imshow("src2-26", src);

    vector<Rect> faces; // 保存检测到的人脸的矩形框
    double st = getTickCount();
    // 对象检测,检测的是什么对象由训练的数据决定
    face_cascade.detectMultiScale(gray, faces, 1.1, 2, 0, Size(30, 30)); // 在不同尺度空间检测,训练的数据对检测的准确率非常重要
    double et = (getTickCount() - st) / getTickFrequency();
    cout << "haar time consume : " << et << ", faces.size=" << faces.size() << endl; // haar time consume : 0.821766, faces.size=3
    for (size_t t = 0; t < faces.size(); t++) 
    {
        rectangle(src, faces[t], Scalar(0, 0, 255), 2, 8, 0);
    }
    imshow("faces", src);

    waitKey(0);
}

效果图

这里写图片描述

猜你喜欢

转载自blog.csdn.net/huanghuangjin/article/details/81302120