haarcascade 分类器(视频图像皆可)

来源:互联网 发布:mac finder 显示路径 编辑:程序博客网 时间:2024/05/03 05:28
#include "cv.h"#include "highgui.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#include <math.h>#include <float.h>#include <limits.h>#include <time.h>#include <ctype.h>#ifdef _EiC#define WIN32#endifstatic CvMemStorage* storage = 0;static CvHaarClassifierCascade* cascade = 0;void detect_and_draw(IplImage* image);const char* cascade_name = "D:/.../opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml";//"haarcascade_frontalface_alt2.xml";/*    "haarcascade_profileface.xml";*/#define _CRTDBG_MAP_ALLOC#include <stdlib.h>#include <crtdbg.h>int main(int argc, char** argv){CvCapture* capture = 0;IplImage *frame, *frame_copy = 0;int optlen = strlen("--cascade=");const char* input_name;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);cvNamedWindow("result", 1);//检测图片//IplImage* image = cvLoadImage("1.jpg", 1);//if (image)//{//detect_and_draw(image);//cvWaitKey(-1);//cvReleaseImage(&image);//}//else//printf("error\n");//检测视频capture = cvCaptureFromAVI("留学.mp4");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 );elsecvFlip( frame, frame_copy, 0 );IplImage *equ = cvCreateImage(cvGetSize(frame_copy),8, 1);IplImage *gray = cvCreateImage(cvGetSize(frame_copy), 8, 1);cvCvtColor(frame_copy, gray, CV_BGR2GRAY);cvEqualizeHist(gray, equ);//cvNamedWindow("yuantu");//cvNamedWindow("equ");//cvShowImage("yuantu",gray);//cvShowImage("equ",equ);detect_and_draw( frame_copy );if( cvWaitKey( 10 ) >= 0 )break;//cvReleaseImage(&gray);//cvReleaseImage(&equ);}cvReleaseImage( &frame_copy );cvReleaseCapture( &capture );}cvWaitKey(-1); //检测图片的时候,等待显示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), 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));printf("face's total is %d\n", faces->total);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);//用矩形框框出cvRectangle(img, cvPoint(r->x * scale, r->y * scale), cvPoint((r->x + r->width) * scale, (r->y + r->height)  * scale), colors[i % 8], 3, 8, 0);/*//用原型框出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);_CrtDumpMemoryLeaks();}


0 0
原创粉丝点击