皮皮网

皮皮网

【矿机源码论坛】【抓源网站源码】【消费机 源码】cvresize源码

时间:2024-12-25 14:00:02 分类:焦点

1.如何用OPENCV和VC实现人眼识别功能?

cvresize源码

如何用OPENCV和VC实现人眼识别功能?

       ã€€ã€€ç»™ä½ ä¸ªä»£ç ï¼Œäººçœ¼ç›è¯†åˆ«ï¼š

       ã€€ã€€#include "stdafx.h"

       ã€€ã€€#include "cv.h"

       ã€€ã€€#include "highgui.h"

       ã€€ã€€#include <stdio.h>

       ã€€ã€€#ifdef _EiC

       ã€€ã€€#define WIN

       ã€€ã€€#endif

       ã€€ã€€static CvMemStorage* storage = 0;

       ã€€ã€€static CvHaarClassifierCascade* cascade = 0;

       ã€€ã€€void detect_and_draw( IplImage* image );

       ã€€ã€€const char* cascade_name =

       ã€€ã€€"haarcascade_eye.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 = "C:/OpenCV2.0/data/haarcascades/haarcascade_eye.xml";//分类器路径

       ã€€ã€€input_name = argc > 1 ? argv[1] : 0;

       ã€€ã€€}

       ã€€ã€€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);

       ã€€ã€€capture = cvCaptureFromCAM( !input_name ? 0 : input_name[0] - '0' );//读取摄像头

       ã€€ã€€if(!capture)//如果没有摄像头读取视频文件

       ã€€ã€€capture = cvCaptureFromAVI("检测.avi");

       ã€€ã€€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( ) >= 0 )

       ã€€ã€€break;

       ã€€ã€€}

       ã€€ã€€cvReleaseImage( &frame_copy );

       ã€€ã€€cvReleaseCapture( &capture );

       ã€€ã€€}

       ã€€ã€€else//没检测到视频文件或者摄像头

       ã€€ã€€{

       ã€€ã€€const char* filename = (char*)"检测.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[+1];

       ã€€ã€€while( fgets( buf, , 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,}},

       ã€€ã€€{ { 0,,}},

       ã€€ã€€{ { 0,,}},

       ã€€ã€€{ { 0,,0}},

       ã€€ã€€{ { ,,0}},

       ã€€ã€€{ { ,,0}},

       ã€€ã€€{ { ,0,0}},

       ã€€ã€€{ { ,0,}}

       ã€€ã€€};

       ã€€ã€€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(, ) );//检测人脸返回矩形人脸

       ã€€ã€€t = (double)cvGetTickCount() - t;

       ã€€ã€€printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*.) );

       ã€€ã€€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.*scale);

       ã€€ã€€cvCircle( img, center, radius, colors[i%8], 3, 8, 0 );

       ã€€ã€€}

       ã€€ã€€}

       ã€€ã€€cvShowImage( "result", img );

       ã€€ã€€cvReleaseImage( &gray );

       ã€€ã€€cvReleaseImage( &small_img );

       ã€€ã€€}