61ic电子在线 首页 技术 图像技术 查看内容

OpenCV人脸识别--detectMultiScale函数_源码

2017-8-21 15:52| 发布者: 61ic| 查看: 1210| 评论: 0|原作者: 61ic|来自: 61ic

摘要: 如果要识别人体的其它部位,只需将上面的haarcascade_frontalface_alt2.xml分类器替换即可。



现在要对上面两张图进行人脸识别。

一、Haar特征分类器介绍

Haar特征分类器就是一个XML文件,该文件中会描述人体各个部位的Haar特征值。包括人脸、眼睛、嘴唇等等。

Haar特征分类器存放目录:opencv安装目录中的\data\ haarcascades目录下,opencv2.4.8版本下的Haar特征分类器如下:

haarcascade_eye.xml  

haarcascade_eye_tree_eyeglasses.xml  

haarcascade_frontalface_alt.xml  

haarcascade_frontalface_alt_tree.xml  

haarcascade_frontalface_alt2.xml  

haarcascade_frontalface_default.xml  

haarcascade_fullbody.xml  

haarcascade_lefteye_2splits.xml  

haarcascade_lowerbody.xml  

haarcascade_mcs_eyepair_big.xml  

haarcascade_mcs_eyepair_small.xml  

haarcascade_mcs_leftear.xml  

haarcascade_mcs_lefteye.xml  

haarcascade_mcs_mouth.xml  

haarcascade_mcs_nose.xml  

haarcascade_mcs_rightear.xml  

haarcascade_mcs_righteye.xml  

haarcascade_mcs_upperbody.xml  

haarcascade_profileface.xml  

haarcascade_righteye_2splits.xml  

haarcascade_smile.xml  

haarcascade_upperbody.xml  

根据命名就可以很快知道各个分类器的用途。

其中:haarcascade_frontalface_alt.xml与haarcascade_frontalface_alt2.xml都是人脸识别的Haar特征分类器了。

二、detectMultiScale函数详解

cvHaarDetectObjects是opencv1中的函数,opencv2中人脸检测使用的是 detectMultiScale函数。它可以检测出图片中所有的人脸,并将人脸用vector保存各个人脸的坐标、大小(用矩形表示),函数由分类器对象调用:

void detectMultiScale(  

    const Mat& image,  

    CV_OUT vector& objects,  

    double scaleFactor = 1.1,  

    int minNeighbors = 3,   

    int flags = 0,  

    Size minSize = Size(),  

    Size maxSize = Size()  

);  


函数介绍:


参数1:image--待检测图片,一般为灰度图像加快检测速度;


参数2:objects--被检测物体的矩形框向量组;

参数3:scaleFactor--表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;

参数4:minNeighbors--表示构成检测目标的相邻矩形的最小个数(默认为3个)。

        如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。

        如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,

        这种设定值一般用在用户自定义对检测结果的组合程序上;

参数5:flags--要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为


        CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,


        因此这些区域通常不会是人脸所在区域;

参数6、7:minSize和maxSize用来限制得到的目标区域的范围。

三、示例代码

#include  

#include  

#include  

  

#include  

#include  

  

using namespace std;  

using namespace cv;  

  

int main()  

{  

      

    // 【1】加载分类器  

    CascadeClassifier cascade;  

    cascade.load("haarcascade_frontalface_alt2.xml");  

  

    Mat srcImage, grayImage,dstImage;  

    // 【2】读取图片  

    srcImage = imread("image.jpg");  

    dstImage = srcImage.clone();  

    imshow("【原图】", srcImage);  

  

    grayImage.create(srcImage.size(), srcImage.type());  

    cvtColor(srcImage, grayImage, CV_BGR2GRAY); // 生成灰度图,提高检测效率  

  

    // 定义7种颜色,用于标记人脸  

    Scalar colors[] =  

    {  

        // 红橙黄绿青蓝紫  

        CV_RGB(255, 0, 0),  

        CV_RGB(255, 97, 0),  

        CV_RGB(255, 255, 0),  

        CV_RGB(0, 255, 0),  

        CV_RGB(0, 255, 255),  

        CV_RGB(0, 0, 255),  

        CV_RGB(160, 32, 240)  

    };  

  

    // 【3】检测  

    vector rect;  

    cascade.detectMultiScale(grayImage, rect, 1.1, 3, 0);  // 分类器对象调用  

  

    printf("检测到人脸个数:%d\n", rect.size());  

  

    // 【4】标记--在脸部画圆  

    for (int i = 0; i < rect.size();i++)  

    {  

        Point  center;  

        int radius;  

        center.x = cvRound((rect[i].x + rect[i].width * 0.5));  

        center.y = cvRound((rect[i].y + rect[i].height * 0.5));  

  

        radius = cvRound((rect[i].width + rect[i].height) * 0.25);  

        circle(dstImage, center, radius, colors[i % 7], 2);  

    }  

  

    // 【5】显示  

    imshow("【人脸识别detectMultiScale】", dstImage);  

      

    waitKey(0);  

    return 0;  

}  

效果图



如果要识别人体的其它部位,只需将上面的haarcascade_frontalface_alt2.xml分类器替换即可。

鲜花

握手

雷人

路过

鸡蛋

地址 :湖南省株洲市天元区利江花园
合作 Email: administration@61ic.com

  • 关注61ic官方微博
    了解最新动态

  • 关注61ic微信公众号
    这里有好玩的讯息

  • 加入61ic交流群
    不断在这里成长

© 2014-2017 HuNan 湖南索炜达电子科技有限公司 . All rights reserved.
湘公网安备 43020202000020号

Archiver|手机版|小黑屋||湘ICP备13001086号-2 QQ 
返回顶部