【轉載】opencv實現人臉檢測

全文轉載自CSDN的博客(不知道怎麼將CSDN的博客轉到博客園,應該沒這功能吧,因此直接複製全文了),轉載地址以下ide

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

本篇文章主要介紹瞭如何使用OpenCV實現人臉檢測。本文不具體講解人臉檢測的原理,直接使用OpenCV實現。優化

OpenCV版本:2.4.10;VS開發版本:VS2012。ui

 

1、OpenCV人臉檢測spa

 

要實現人臉識別功能,首先要進行人臉檢測,判斷出圖片中人臉的位置,才能進行下一步的操做。.net

 

一、OpenCV人臉檢測的方法code

 

在OpenCV中主要使用了兩種特徵(即兩種方法)進行人臉檢測,Haar特徵和LBP特徵。視頻

在OpenCV中,使用已經訓練好的XML格式的分類器進行人臉檢測。在OpenCV的安裝目錄下的sources文件夾裏的data文件夾裏能夠看到下圖所示的內容:xml

上圖中文件夾的名字「haarcascades」、「hogcascades」和「lbpcascades」分別表示經過「haar」、「hog」和「lbp」三種不一樣的特徵而訓練出的分類器:即各文件夾裏的文件。"haar"特徵主要用於人臉檢測,「hog」特徵主要用於行人檢測,「lbp」特徵主要用於人臉識別。打開「haarcascades」文件夾,以下圖所示對象

圖中的XML文件便是咱們人臉檢測所須要的分類器文件。在實際使用中,推薦使用上圖中被標記的「haarcascade_frontalface_alt2.xml」分類器文件,準確率和速度都比較好。

 

二、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(): 表示人臉的最大最小尺寸

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");   //加載分類器,注意文件路徑

    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;
}

結果以下圖:

二、檢測視頻中的人臉

 

//頭文件  
#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;  
}  

在視頻實時檢測時,可能會出現卡頓,是由於檢測人臉花費了過多的時間,這裏代碼只實現基本功能,並未優化。

相關文章
相關標籤/搜索