天天看點

opencv 檢測人臉

#include "cv.h"               
#include "highgui.h"    
   
int main()    
{    
 //讀取攝像頭    
   //聲明IplImage指針    
  IplImage* pFrame = NULL;     
   
  CvCapture* pCapture = NULL;    
  IplImage* pgray=NULL;    
  IplImage* pcanny;    
  CvMemStorage* storage=0;    
   
  CvHaarClassifierCascade* cascade=0;    
  char cascadename[100]="D:\\OpenCV2.1\\data\\haarcascades\\haarcascade_frontalface_alt2.xml"; //訓練好的級聯表可以用于比對   
  cascade = (CvHaarClassifierCascade*)cvLoad(cascadename,0,0,0);    
  storage = cvCreateMemStorage(0);    
  CvSeq* faces;    
        
  //視窗通過視窗名來辨別    
  cvNamedWindow("video", 1);      
   
  pCapture = cvCaptureFromCAM(-1);  //cvCreateCameraCapture(-1);//-1代表打開哪個攝像頭都無所謂或隻有一個攝像頭  
   
       
  bool first=true;    
  while(pFrame = cvQueryFrame( pCapture ))    
  {    
      if(first)//初次循環,做些初始化    
      {    
         first=false;    
         //建立單通道圖檔     
         pgray=cvCreateImage(cvGetSize(pFrame),IPL_DEPTH_8U,1);    
         //這是canny邊緣監測,和我原來做的差分得邊緣不是一個級别的    
         pcanny=cvCreateImage(cvGetSize(pFrame),IPL_DEPTH_8U,1);             
      }    
      //将彩色圖轉化為2值圖    
      cvCvtColor(pFrame,pgray,CV_BGR2GRAY);    
      cvCanny(pgray,pcanny,30,100,3);        //canny邊緣檢測     
          
      /*********************************/     
      //檢測人臉,    
      faces = cvHaarDetectObjects(pgray,cascade,    
                                         storage,1.1,2,0    
                                         ,cvSize(30,30));    
      for(short i=0;i<(faces?faces->total:0);i++)    
      {                                     
              //得到人臉的區域     
              CvRect* rect = (CvRect*)cvGetSeqElem(faces,i);    
              //在人臉區域畫個圓圈    
              CvPoint center;     //中心    
              center.x=rect->x+rect->width/2;    
              center.y=rect->y+rect->height/2;    
              short radius = sqrt(pow(rect->width,2)//半徑    
                                  +pow(rect->height,2))/2;    
              CvScalar color={{255,0,0}};  //畫圈的顔色    
              cvCircle(pFrame,center,radius,color,3,8,0);    
              /**********************************/     
      }                     
      //顯示圖像    
      //cvShowImage("video", pcanny);    
              
      cvShowImage("video", pFrame);    
      //延時 ,不然不會顯示圖像的,應該是掃描太快了    
      if(cvWaitKey(10)>= 0)    
      {    
        break;    
      }    
  }    
  //釋放圖像    
  cvReleaseImage(&pFrame);    
  cvReleaseImage(&pgray);    
  cvReleaseImage(&pcanny);    
   
  //銷毀視窗    
  cvDestroyWindow("video");    
   //釋放攝像裝置    
   cvReleaseCapture(&pCapture);    
   return 0;     
}   
           

繼續閱讀