zoukankan      html  css  js  c++  java
  • 【转载】opencv实现人脸检测

    全文转载自CSDN的博客(不知道怎么将CSDN的博客转到博客园,应该没这功能吧,所以直接复制全文了),转载地址如下

    http://blog.csdn.net/lsq2902101015/article/details/47057081

    本篇文章主要介绍了如何使用OpenCV实现人脸检测。本文不具体讲解人脸检测的原理,直接使用OpenCV实现。

    OpenCV版本:2.4.10;VS开发版本:VS2012。

    一、OpenCV人脸检测

    要实现人脸识别功能,首先要进行人脸检测,判断出图片中人脸的位置,才能进行下一步的操作。

    1、OpenCV人脸检测的方法

    在OpenCV中主要使用了两种特征(即两种方法)进行人脸检测,Haar特征和LBP特征。

    在OpenCV中,使用已经训练好的XML格式的分类器进行人脸检测。在OpenCV的安装目录下的sources文件夹里的data文件夹里可以看到下图所示的内容:

    上图中文件夹的名字“haarcascades”、“hogcascades”和“lbpcascades”分别表示通过“haar”、“hog”和“lbp”三种不同的特征而训练出的分类器:即各文件夹里的文件。"haar"特征主要用于人脸检测,“hog”特征主要用于行人检测,“lbp”特征主要用于人脸识别。打开“haarcascades”文件夹,如下图所示

    图中的XML文件即是我们人脸检测所需要的分类器文件。在实际使用中,推荐使用上图中被标记的“haarcascade_frontalface_alt2.xml”分类器文件,准确率和速度都比较好。

    2、OpenCV中的人脸检测的类

    在OpenCV中,使用类“CascadeClassifier”进行人脸检测

    CascadeClassifier faceCascade;   //实例化对象  

    所需要使用的函数:

    faceCascade.load("../data/haarcascade_frontalface_alt2");  //加载分类器  
    faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0));  //多尺寸检测人脸  

    实现人脸检测主要依赖于detectMultiScale()函数,下面简单说一下函数参数的含义,先看函数原型:

    1. CV_WRAP virtual void detectMultiScale( const Mat& image,  
    2.                                    CV_OUT vector<Rect>& objects,  
    3.                                    double scaleFactor=1.1,  
    4.                                    int minNeighbors=3, int flags=0,  
    5.                                    Size minSize=Size(),  
    6.                                    Size maxSize=Size() );  

    各参数含义:

    • const Mat& image: 需要被检测的图像(灰度图)
    • vector<Rect>& objects: 保存被检测出的人脸位置坐标序列
    • double scaleFactor: 每次图片缩放的比例
    • int minNeighbors: 每一个人脸至少要检测到多少次才算是真的人脸
    • int flags: 决定是缩放分类器来检测,还是缩放图像
    • Size(): 表示人脸的最大最小尺寸

    二、代码实现

    1、检测图片中的人脸

    //头文件
    #include<opencv2/objdetect/objdetect.hpp>
    #include<opencv2/highgui/highgui.hpp>
    #include<opencv2/imgproc/imgproc.hpp>
    
    using namespace cv;
    
    //人脸检测的类
    CascadeClassifier faceCascade;
    
    int main()
    {
        faceCascade.load("../data/haarcascade_frontalface_alt2.xml");   //加载分类器,注意文件路径
    
        Mat img = imread("../data/PrettyGirl.jpg");
        Mat imgGray;
        vector<Rect> faces;
    
        if(img.empty())
        {
          return 1;
        }
    
        if(img.channels() ==3)
        {
           cvtColor(img, imgGray, CV_RGB2GRAY);
        }
        else
        {
           imgGray = img;
        }
    
        faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0));   //检测人脸
    
        if(faces.size()>0)
        {
           for(int i =0; i<faces.size(); i++)
           {
               rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), 
                               Scalar(0, 255, 0), 1, 8);    //框出人脸位置
           }
        }
    
        imshow("FacesOfPrettyGirl", img);
    
        waitKey(0);
        return 0;
    }

    结果如下图:

    2、检测视频中的人脸

    //头文件  
    #include<opencv2/objdetect/objdetect.hpp>  
    #include<opencv2/highgui/highgui.hpp>  
    #include<opencv2/imgproc/imgproc.hpp>  
      
    using namespace cv;  
      
    //人脸检测的类  
    CascadeClassifier faceCascade;  
      
    int main()  
    {  
        faceCascade.load("../data/haarcascade_frontalface_alt2.xml");   //加载分类器,注意文件路径  
      
        VideoCapture cap;    
        cap.open(0);   //打开摄像头  
        //cap.open("../data/test.avi");   //打开视频  
        Mat img, imgGray;  
        vector<Rect> faces;  
        int c = 0;  
      
        if(!cap.isOpened())  
        {  
          return 1;  
        }  
      
        while(c!=27)  
        {  
            cap>>img;  
           if(img.channels() ==3)  
           {  
              cvtColor(img, imgGray, CV_RGB2GRAY);  
           }  
           else  
           {  
              imgGray = img;  
           }  
      
           faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0));   //检测人脸  
      
           if(faces.size()>0)  
           {  
              for(int i =0; i<faces.size(); i++)  
              {  
                  rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height),   
                                  Scalar(0, 255, 0), 1, 8);    //框出人脸位置  
              }  
           }  
          
           imshow("Camera", img);  
           c = waitKey(1);  
        }  
        return 0;  
    }  

    在视频实时检测时,可能会出现卡顿,是因为检测人脸花费了过多的时间,这里代码只实现基本功能,并未优化。

  • 相关阅读:
    opencvadd加法
    opencvcopyMakeBorder拓展边界
    opencvcountNonZero计算非0值个数
    opencvcompare比较
    opencvputText绘字
    opencvaddWeighted加法
    opencvconvertScaleAbs位深转化函数
    opencvsplit分离通道
    软件测试的人际关系(转载)
    Struts 1.3.10 jar包官网下载地址
  • 原文地址:https://www.cnblogs.com/little-monkey/p/7987313.html
Copyright © 2011-2022 走看看