OpenCV攝像頭人臉識別

注:ios

從外設攝像裝置中獲取圖像幀,把每幀的圖片與人臉特徵進行匹配,用方框框住識別出來的人臉ide

須要用到的函數:函數

CvHaarClassifierCascade* cvLoadHaarClassifierCascade( const char* directory, CvSize orig_window_size );ui

第一個參數:訓練好的級聯分類器的路徑spa

第二個參數:級聯分類器訓練中採用的檢測目標的尺寸code

 

#include "stdafx.h"
#include "iostream"
using namespace std;
#include "opencv2/opencv.hpp"
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
#include "Windows.h"
void main()
{

    IplImage *pFrame = NULL;
    IplImage *pGrayImg = NULL;

    //加載Haar特徵檢測分類器  
    const char *pCascadeFileName = "E:/C_VC_code/opencv/haarcascade_frontalface_alt2.xml";
    //CvHaarClassifierCascade *pHaarCascade  = (CvHaarClassifierCascade*)cvLoad(pCascadeFileName);  
    CvHaarClassifierCascade *pHaarCascade  = cvLoadHaarClassifierCascade(pCascadeFileName,cvSize(200,200));  

    CvCapture *pCapture = cvCreateCameraCapture(0); //獲取攝像頭  
    cout<< "加載成功..." <<endl;
    int nFrmNum = 0;

    if(!pCapture)
    {
        cout<<"加載失敗..."<<endl;
        return ;
    }
    //create window
    cvNamedWindow("Video",1);
    
    CvMemStorage *pcvMStorage; 
    CvSeq *pCvSeq;

    while(pFrame = cvQueryFrame(pCapture))    //逐幀讀取
    {
        pGrayImg = cvCreateImage(cvGetSize(pFrame), IPL_DEPTH_8U, 1);
        cvCvtColor(pFrame, pGrayImg, CV_BGR2GRAY);  

        //---------------人臉識別-------------------------
        if (pHaarCascade != NULL)  
        {         
            pcvMStorage = cvCreateMemStorage(0);  
            cvClearMemStorage(pcvMStorage);

            // 識別  
            pCvSeq = cvHaarDetectObjects(pGrayImg, pHaarCascade, pcvMStorage);   
          
            // 標記  
            for(int i = 0; i <pCvSeq->total; i++)  
            {  
                CvRect* r = (CvRect*)cvGetSeqElem(pCvSeq, i);  
                CvPoint pt[4];
                pt[0] = cvPoint(r->x,r->y);
                pt[1] = cvPoint(r->x+r->width,r->y);
                pt[2] = cvPoint(r->x+r->width,r->y+r->height);
                pt[3] = cvPoint(r->x,r->y+r->height);
                CvPoint* ppt=pt;
                int count=4;
                cvPolyLine( pFrame, &ppt,&count,1,1,CV_RGB(10,240,33),2);//畫矩形
            }  

            cvReleaseMemStorage(&pcvMStorage);
        }  
      
        cvShowImage("Video",pFrame);
        //---------------人臉識別-------------------------
        char c = cvWaitKey(33);    //按esc退出
        if(c==27)
        {
            cvDestroyWindow("Video");  
            cvReleaseImage(&pFrame);   
            cvReleaseImage(&pGrayImg);  
            return;
        }
    }
}