简单人脸识别

来源:互联网 发布:博易大师行情软件 编辑:程序博客网 时间:2024/05/18 22:40

#include <cv.h>
#include <cvcam.h>
#include <cxcore.h>
#include <highgui.h>
#include <stdlib.h>
#include <stdio.h>

#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cvcam.lib")
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"highgui.lib")

CvMemStorage *storage=NULL;
CvHaarClassifierCascade *cascade=NULL;
char *filename="1.jpg";


void detect_and_draw( IplImage* image );

void main()
{
 
 printf("输入 m 用以 获取头像/n");

 //创建摄像头capture对象
 CvCapture *capture=cvCreateCameraCapture( CV_CAP_ANY);
 if (NULL==capture) return;

 //创建用以指向所处理图像的指针
 IplImage *image=cvQueryFrame(capture);
 if (NULL==image) return;
 
 //用以初始化cascade对象
 storage=cvCreateMemStorage(0);
 assert(storage!=NULL);

 cascade=(CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_alt2.xml",NULL,NULL,NULL);
 assert(storage!=NULL);

 //创建窗口
 cvNamedWindow("Show_Result");
 cvNamedWindow("Show_Head");
 
 //如果获取图像成功进入循环执行detect_and_draw函数
 while ((image=cvQueryFrame(capture))!=NULL)
 {
  detect_and_draw(image);

  if (27==cvWaitKey(30))
  {
   break;
  }
 }

}


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}}
    };
 
 IplImage *dst_image_head=NULL;
 IplImage *dst_image_head_gray=NULL;

    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 );
    int i;

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

    if( cascade )
    {
        double t = (double)cvGetTickCount();
        CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage,
                                            1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/,
                                            cvSize(30, 30) );
//       t = (double)cvGetTickCount() - t;
//       printf( "detection time = %gms/n", t/((double)cvGetTickFrequency()*1000.) );
        for( 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 );
   //在图像上画出脸的部位
       cvDrawRect(img,cvPoint(r->x*scale,r->y*scale),cvPoint((r->x+r->width)*scale,(r->y+r->height)*scale),CV_RGB(0,255,0),1);
   
    //单独将人脸信息提取出来,前者为实际图像,后者做这方图均衡化使用
    IplImage *dst_image_head=cvCreateImage(cvSize(r->width*scale,r->height*scale),img->depth,img->nChannels);
    IplImage *dst_image_head_gray=cvCreateImage(cvGetSize(dst_image_head),IPL_DEPTH_8U,1);

    //设置感兴趣区域将人脸部分 提取出来
    cvSetImageROI(img,cvRect(r->x*scale,r->y*scale,(r->width)*scale,(r->height)*scale));
    cvCopy(img,dst_image_head);
    cvResetImageROI(img);
   
    //旋转脸部图像
    cvFlip(dst_image_head,dst_image_head,0);

    //将提取的图像转换成灰度,以便指向直方图均衡化
    cvCvtColor(dst_image_head,dst_image_head_gray,CV_BGR2GRAY);

    //如果输入执行直方图均衡化,并显示出来
    char c=cvWaitKey(1);
    if ('m'==c || 'm'==c)
    {
    cvEqualizeHist(dst_image_head_gray,dst_image_head_gray);
    cvShowImage("Show_Head",dst_image_head_gray);
    }
   //

        }
    }

    cvShowImage( "Show_Result", img );
// cvShowImage("Show_Head",dst_image_head);
    cvReleaseImage( &gray );
    cvReleaseImage( &small_img );
}

原创粉丝点击