tony-yang-flutter

一、概述

  案例:使用opencv级联分类器CascadeClassifier+其提供的特征数据实现人脸检测,检测到人脸后使用红框画出来。 

API介绍:
detectMultiScale( InputArray image, CV_OUT std::vector
<Rect>& objects,double scaleFactor = 1.1, int minNeighbors = 3, int flags = 0, Size minSize = Size(), Size maxSize = Size(), );
image:输入图像
objects:检测到的目标区域数组(因一副图像中有可能有多个人脸)
scaleFactor:搜索前后两次窗口大小比例系数,默认为1:1,即每次搜索窗口扩大10%
minNeighbors:构成检测目标的相邻矩形的最小个数 如果组成检测目标的小矩形的个数和小于minneighbors - 1 都会被排除,如果minneighbors为0 则函数不做任何操作就返回所有被检候选矩形框。
flags:若设置为CV_HAAR_DO_CANNY_PRUNING 函数将会使用Canny边缘检测来排除边缘过多或过少的区域,默认写0即可
minSize:检测的最小尺寸
maxSize:检测的最大尺寸

  实现人脸检测的步骤:

    1.实例化CascadeClassifier face_cascade

    2.使用load加载特征数据

    3.载入待检测图像

    4.图像灰度化

    5.将灰度图进行直方图均衡化

    6.进行多尺度检测,并输出检测到的人脸区域候选数组

    7.将人脸区域数组绘制并显示到原图输出

  

二、代码示例

 //加载特征数据
    CascadeClassifier face_cascade;
    if(!face_cascade.load(xmlPath.toStdString())){
        qDebug()<<"不能加载特征数据";
        return;
    }

    Mat src = imread(filePath);
    if(src.empty()){
        qDebug()<<"图片不能为空";
        return;
    }
    imshow("src",src);
    Mat gray;
    cvtColor(src,gray,COLOR_BGR2GRAY);
    //进行直方图均衡化
    equalizeHist(gray,gray);
//    imshow("equalizHist",gray);

    //执行多尺度特征检测
    vector<Rect> faces;
    face_cascade.detectMultiScale(gray,faces,1.1,minTargetRectCount,0,Size(24,24));
    for(size_t i = 0;i<faces.size();i++){
        rectangle(src,faces[i],Scalar(0,0,255),2,LINE_8,0);
    }
    imshow("result",src);

 

三、示例图片

 

 

 

 

 

相关文章: