人臉識別簡單例子

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>

static CvHaarClassifierCascade *cascade;// 加載分類器
static CvMemStorage *storage=0;// 保存圖像內存

void detect_and_draw(IplImage *image);// 識別人臉重繪圖像

const char *cascade_name="haarcascade_frontalface_alt.xml";// 分類器文件名稱

int main(int argc, char *argv[])
{
 IplImage* img = 0;// 圖像指針

 // 載入圖像
 img=cvLoadImage("Lena.jpg");
 cascade = (CvHaarClassifierCascade *)cvLoad(cascade_name,0,0,0);  //加載人臉檢測所用的分類器
 
 if( !cascade )
 {
  fprintf( stderr, "ERROR: Could not load classifier cascade\n" );
  return -1;
 }
 storage = cvCreateMemStorage(0);  //動態存儲結構,用來存儲人臉在圖像中的位置

 // 創建窗口
 cvNamedWindow("mainWin", 1);  
 detect_and_draw(img);
 
 // wait for a key 
 cvWaitKey(0); 
 
 // release the image 
 cvReleaseImage(&img );
 cvDestroyWindow("mainWin");
 return 0;
}

void detect_and_draw( IplImage* img )
{
 static CvScalar colors[] =
 {
  {{0,0,255}},
  {{0,128,255}},
  {{0,255,255}},
  {{0,255,0}},
  {{255,128,0}},
  {{255,255,0}},
  {{255,0,0}},
  {{255,0,255}}
 };

 double scale = 1.3;
 IplImage* gray = cvCreateImage( cvSize(img->width,img->height), 8, 1 );
 IplImage* small_img = cvCreateImage( cvSize( cvRound (img->width/scale),
  cvRound (img->height/scale)), 8, 1 );

 cvCvtColor( img, gray, CV_BGR2GRAY );
 cvResize( gray, small_img, CV_INTER_LINEAR );
 cvEqualizeHist( small_img, small_img );
 cvClearMemStorage( storage );

 if( cascade )
 {
  /*函數cvHaarDetectObjects檢測圖像中的目標,由OpenCV提供。*/
  CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage, 1.1, 2, 0 ,
   cvSize(30, 30) );
  for( int i = 0; i < (faces ? faces->total : 0); i++ )
  {
   CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
   CvPoint center;
   int radius;
   center.x = cvRound((r->x + r->width*0.5)*scale);
   center.y = cvRound((r->y + r->height*0.5)*scale);
   radius = cvRound((r->width + r->height)*0.25*scale);
   cvCircle( img, center, radius, colors[i%8], 3, 8, 0 );
  }
 }

 cvShowImage( "result", img );
 cvReleaseImage( &gray );
 cvReleaseImage( &small_img );
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章