OpenCV通过Harr分类器人脸识别
来源:互联网 发布:傣族 泰国 知乎 编辑:程序博客网 时间:2024/06/06 00:07
- #include <cv.h>
- #include <highgui.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <assert.h> //用于防御式编程
- #include <math.h>
- #include <float.h>//<float.h>与<limits.h>一样是定义边界值的,<float.h>定义的是浮点数的边界值
- #include <limits.h>
- #include <time.h>
- #include <ctype.h>//在调用字符函数时,在源文件中包含的头文件
-
- #pragma comment(lib, "cv.lib")
- #pragma comment(lib, "cxcore.lib")
- #pragma comment(lib, "highgui.lib")
-
- static CvMemStorage *storage = 0;
- static CvHaarClassifierCascade *cascade = 0;
- void detect_and_draw( IplImage *image);
- const char *cascade_name = "haarcascade_frontalface_alt.xml";
- int main( int argc, char **argv)
- {
- CvCapture *capture = 0;
- IplImage *frame, *frame_copy = 0;
- int optlen = strlen("--cascade=");
- const char *input_name;
- if (argc > 1 && strncmp ( argv[1], "--cascade=", optlen ) == 0 )
- {
- cascade_name = argv[1] + optlen;
- input_name = argc > 2 ? argv[2] : 0;
- }
- else
- {
- cascade_name = "haarcascade_frontalface_alt2.xml";
- input_name = argc > 1 ? argv[1] : "test.png";
- }
- cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0);
- if ( !cascade )
- {
- fprintf( stderr, "ERROR:could not load classifier cascade\n");
- fprintf( stderr, "Usage:facedetect --cascade=\"<cascade_path>\" [filename|camera_index]\n");
- return -1;
- }
- storage = cvCreateMemStorage(0);
- if ( !input_name || (isdigit(input_name[0]) && input_name[1] == '\0'))
- capture = cvCaptureFromCAM( !input_name ? 0 : input_name[0] - '0');
- else
- capture = cvCaptureFromAVI( input_name );
- cvNamedWindow( "result", 1);
- if (capture)
- {
- for(;;)
- {
- if (!cvGrabFrame( capture ))
- break;
- frame = cvRetrieveFrame( capture );
- if (!frame)
- break;
- if (!frame_copy)
- frame_copy = cvCreateImage( cvSize(frame->width,frame->height),
- IPL_DEPTH_8U,frame->nChannels);
- if (frame->origin == IPL_ORIGIN_TL)
-
- cvCopy (frame, frame_copy, 0);
- else
- cvFlip (frame, frame_copy, 0);
- detect_and_draw( frame_copy );
- if(cvWaitKey (10) >= 0)
- break;
- }
-
-
- cvReleaseImage( &frame_copy );
- cvReleaseCapture( &capture);
- }
- else
- {
-
- const char *filename = input_name ? input_name : (char*)"Lena.jpg";
- IplImage *image = cvLoadImage(filename, 1);
- if (image)
- {
- detect_and_draw(image);
- cvWaitKey(0);
- cvReleaseImage(&image);
- }
- else
- {
-
-
- FILE *f = fopen(filename, "rt");
- if (f)
- {
- char buf[1000+1];
- while (fgets(buf, 1000 , f))
- {
- int len = (int)strlen(buf);
-
- while ( len > 0 && isspace(buf[len-1]))
- len--;
- buf[len] = '\0';
- image = cvLoadImage(buf, 1);
- if (image)
- {
- detect_and_draw(image);
- cvWaitKey(0);
- cvReleaseImage(&image);
- }
- }
- fclose(f);
- }
- }
- }
-
- cvDestroyWindow("result");
- 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), IPL_DEPTH_8U, 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,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 pt1, pt2;
-
- pt1.x = r->x*scale;
- pt2.x = (r->x+r->width)*scale;
- pt1.y = r->y*scale;
- pt2.y = (r->y+r->height)*scale;
-
- cvRectangle( img, pt1, pt2, colors[i%8], 3, 8, 0 );
- }
- }
- cvShowImage("result",img);
- cvReleaseImage(&gray);
- cvReleaseImage(&small_img);
- }