此函数用已经训练好的分类器(xml文件)来检测人脸人眼等。

【参数说明】

1.image——待检测图片,一般为灰度图像加快检测速度;

2.objects——被检测物体的矩形框向量组;

3.scaleFactor——每次图像尺寸减小的比例,默认为1.1,即每次缩小10%

4.minNeighbors——默认3,每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸)

5.flags——要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因为这些区域通常不会是人脸所在区域;

6.minSize——目标的最小尺寸

7.maxSize——目标的最大尺寸

【用法】

opencv源码目录D:\source\opencv-3.4.9\data\haarcascades里有很多训练好的xml,检测人脸的用以下之一。

opencv detectMultiScale(),批量读取目录内图片_xml

把xml文件放到自己的工程目录中,运行下述代码即可。(图片网上找一个就可以)

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
    // 【1】加载分类器
    CascadeClassifier cascade;
    cascade.load("haarcascade_frontalface_default.xml");
    // 【2】读取图片
    Mat srcImage, grayImage;
    srcImage = imread("D:/face.jpg");
    imshow("【原图】", srcImage);
    cvtColor(srcImage, grayImage, CV_BGR2GRAY); // 生成灰度图,提高检测效率
    // 定义3种颜色,用于标记人脸
    Scalar colors[] =
    {
        //蓝绿红
        Scalar(255, 0, 0),
        Scalar(0, 255, 0),
        Scalar(0, 0, 255),
    };
    // 【3】检测
    vector<Rect> rects;
    cascade.detectMultiScale(grayImage, rects, 1.1, 3, 0);  // 分类器对象调用
    printf("检测到人脸个数:%d\n", rects.size());
    // 【4】标记--在脸部画圆
    for (int i = 0; i < rects.size(); i++)
    {
        Point  center;
        int radius;
        //画圆
        center.x = cvRound((rects[i].x + rects[i].width * 0.5));
        center.y = cvRound((rects[i].y + rects[i].height * 0.5));
        radius = cvRound((rects[i].width + rects[i].height) * 0.25);
        circle(srcImage, center, radius, colors[i % 3], 2);
        //画矩形
        rectangle(srcImage, Rect(rects[i].x, rects[i].y, rects[i].width, rects[i].height), colors[i % 3], 2);
    }
    // 【5】显示
    imshow("【人脸识别detectMultiScale】", srcImage);

    waitKey(0);
    return 0;
}

opencv detectMultiScale(),批量读取目录内图片_灰度图_02

【批量读取图片】

    cv::String path = "D:/data/*.jpg";
    vector<cv::String> paths;
    glob(path, paths);//遍历结果存储到paths中,paths内容格式如,D:/data/3.jpg
    Mat srcImg, grayImg;
    for (int i = 0; i < paths.size(); i++)
    {
        srcImg = imread(paths[i]);
        cvtColor(srcImg, grayImg, CV_BGR2GRAY); // 生成灰度图,提高检测效率
        …………其他代码…………
    }