Wednesday, June 8, 2011

Face Detection and make ROI Code in C - opencv

#include "stdafx.h"
#ifndef _EiC
#include "cv.h"
#include "highgui.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#endif
#ifdef _EiC
#define WIN32
#endif

static CvMemStorage* storage = 0;
static CvHaarClassifierCascade* cascade = 0;
void detect_and_draw( IplImage* image, int );
const char* cascade_name ="haarcascade_frontalface_default.xml";
int main( int argc, char** argv )
{
CvCapture* capture = 0;
IplImage *frame, *frame_copy = 0;
int counter=0;
int optlen = strlen("--cascade= ");
const char* input_name;
cascade =(CvHaarClassifierCascade*)cvLoad( "haarcascade_frontalface_default.xml",0, 0, 0 );
if( !cascade )
{
fprintf( stderr, "ERROR: Could not load classifier cascade\n" );
return -1;
}
storage = cvCreateMemStorage( 0);
capture = cvCaptureFromCAM( 0 );
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 );
++counter;
cvSaveImage("F.jpg", frame_copy);
detect_and_draw( frame_copy,counter);

if( cvWaitKey( 10 ) >= 0 )
break;

}

cvReleaseImage( &frame_copy );
cvReleaseCapture( &capture );
}


return 0;
}

void detect_and_draw( IplImage* img, int counter)
{
int scale = 1;
IplImage* temp = cvCreateImage(
cvSize(img-> width/scale, img->height/ scale), 8, 3 );
CvPoint pt1, pt2;
IplImage* face = 0;
int i;
cvClearMemStorage( storage );
if( cascade )
{
CvSeq* faces = cvHaarDetectObjects ( img, cascade, storage,1.1, 2, CV_HAAR_DO_CANNY_PRUNING,cvSize(40, 40) );
for( i = 0; i < (faces ? faces->total : 0); i++ )
{
CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
pt1.x = r->x*scale;
pt2.x = (r->x+r->width) *scale;
int width = pt2.x-pt1.x;
pt1.y = r->y*scale;
pt2.y = (r->y+r->height) *scale;
int height = pt2.y-pt1.y;

cvRectangle( img, pt1, pt2, CV_RGB(255,0, 0), 1, 8, 0 );

if(counter==1)
{
cvSetImageROI(img, cvRect(pt1.x+1,pt1.y+1,width-1,height-1));
cvSaveImage("Roi.jpg",img);
cvResetImageROI(img);
}



}
}

cvShowImage( "result", img );
cvReleaseImage( &temp );
}

#ifdef _EiC
main(1,"facedetect. c");
#endif

No comments:

Post a Comment