Pada pengembangannya, Haarcascade
tidak hanya bisa mendeteksi wajah saja, namun juga dapat mendeteksi tubuh
manusia. Ada tiga macam bagian tubuh yang dapat dideteksi dengan menggunakan
teknik haarcascade yaitu: Upperbody (tubuh bagian atas), Lowerbody (tubuh
bagian bawah) dan Fullbody (seluruh tubuh). Program deteksi tubuh manusia ini
mirip dengan program deteksi wajah. Bedanya hanya pada data yang digunakan
sebagai metode deteksi adalah menggunakan haarcascade_fullbody.xml,
haarcascade_lowerbody.xml atau haarcascade_upperbody.xml. Berikut ini contoh
program deteksi tubuh manusia.
PROGRAM
#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
#endif
static CvMemStorage* storage = 0;
static CvHaarClassifierCascade* cascade_face = 0;
static CvHaarClassifierCascade* cascade_upperbody = 0;
void detect_and_draw( IplImage* image );
const char* cascade_name1 ="haarcascade_upperbody";
const char* cascade_name2 ="haarcascade_frontalface_alt_tree";
int main( int argc, char** argv )
{
CvCapture* capture = 0;
IplImage *frame, *frame_copy = 0;
cascade_name1 = "haarcascade_upperbody.xml";
cascade_name2 = "haarcascade_frontalface_alt_tree.xml";
cascade_upperbody = (CvHaarClassifierCascade*)cvLoad( cascade_name1, 0, 0, 0 );
cascade_face = (CvHaarClassifierCascade*)cvLoad( cascade_name2, 0, 0, 0 );
if( !cascade_upperbody )
{
fprintf( stderr, "ERROR: Could not load classifier cascade upperbody\n" );
fprintf( stderr, "Usage: facedetect --cascade=\"<cascade_path>\" [filename|camera_index]\n" );
return -1;
}
if( !cascade_face )
{
fprintf( stderr, "ERROR: Could not load classifier cascade face\n" );
fprintf( stderr, "Usage: facedetect --cascade=\"<cascade_path>\" [filename|camera_index]\n" );
return -1;
}
storage = cvCreateMemStorage(0);
capture = cvCaptureFromCAM(1);
cvNamedWindow( "result", 1 );
if( capture )
{
while(1) //for(;;)
{
/* cvGrabFrame (memegang dg kasar)
grab a frame, return 1 on success, 0 on fail.
this function is thought to be fast*/
/* get the frame grabbed with cvGrabFrame(..)
This function may apply some frame processing like
frame decompression, flipping etc.
/* Just a combination of cvGrabFrame and cvRetrieveFrame*/
/*
//jika frame tidak dipegang, break
if( !cvGrabFrame( capture ))
break;
//jika dipegang ambil frame tadi dengan cvRetrieveFrame
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 );
*/
IplImage* frame = cvQueryFrame( capture );
detect_and_draw(frame);
if( cvWaitKey( 10 ) >= 0 )
break;
}
cvReleaseImage( &frame_copy );
cvReleaseCapture( &capture );
}
cvDestroyWindow("result");
return 0;
}
void detect_and_draw( IplImage* img )
{
static CvScalar colors[] =
{
{{0,0,255}}, //biru
{{0,128,255}}, //biru muda
{{0,255,255}}, //sian
{{0,255,0}}, //hijau
{{255,128,0}}, //orange
{{255,255,0}}, //kuning
{{255,0,0}}, //merah
{{255,0,255}} //magenta
};
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_upperbody )
{
unsigned char a=0;
double t = (double)cvGetTickCount();
CvSeq* body = cvHaarDetectObjects( small_img, cascade_upperbody, storage, 1.1 , 2 , 0,cvSize(50, 50) );
t = (double)cvGetTickCount() - t;
//printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) );
for( i = 0; i < (body ? body->total : 0); i++ )
{
a=1;
CvRect* r = (CvRect*)cvGetSeqElem( body, i );
cvRectangle(img,cvPoint((r->x)*scale,(r->y)*scale),cvPoint((r->x + r->width)*scale, (r->y + r->height)*scale),cvScalar(255,255,0),2,8,0);
}
if (a==1)
{
//Menampilkan text pada layar
CvFont font;
cvInitFont( &font, CV_FONT_HERSHEY_SIMPLEX, 1.0, 1.0, 0, 1, 8);
cvPutText(img,"Badan depan terdeteksi",cvPoint(100,50),&font,CV_RGB(0,255,0));
//printf( "detected\n");
}
else
{
//diam
}
}
if( cascade_face)
{
unsigned char b=0;
CvSeq* face = cvHaarDetectObjects( small_img, cascade_face, storage, 1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING dan CV_HAAR_SCALE_IMAGE
*/,cvSize(30, 30) ); //Oke
for( i = 0; i < (face ? face->total : 0); i++ )
{
printf("face detected\n");
CvRect* r = (CvRect*)cvGetSeqElem( face, 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, cvScalar( 0,128,255), 3, 8, 0 );
b=1;
}
if (b==1)
{
//Menampilkan text pada layar
CvFont font;
cvInitFont( &font, CV_FONT_HERSHEY_SIMPLEX, 1.0, 1.0, 0, 1, 8);
cvPutText(img,"Wajah terdeteksi",cvPoint(100,100),&font,CV_RGB(0,255,0));
//printf( "detected\n");
}
else
{
//diam
}
}
cvShowImage( "result", img );
cvReleaseImage( &gray );
cvReleaseImage( &small_img );
}
#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
#endif
static CvMemStorage* storage = 0;
static CvHaarClassifierCascade* cascade_face = 0;
static CvHaarClassifierCascade* cascade_upperbody = 0;
void detect_and_draw( IplImage* image );
const char* cascade_name1 ="haarcascade_upperbody";
const char* cascade_name2 ="haarcascade_frontalface_alt_tree";
int main( int argc, char** argv )
{
CvCapture* capture = 0;
IplImage *frame, *frame_copy = 0;
cascade_name1 = "haarcascade_upperbody.xml";
cascade_name2 = "haarcascade_frontalface_alt_tree.xml";
cascade_upperbody = (CvHaarClassifierCascade*)cvLoad( cascade_name1, 0, 0, 0 );
cascade_face = (CvHaarClassifierCascade*)cvLoad( cascade_name2, 0, 0, 0 );
if( !cascade_upperbody )
{
fprintf( stderr, "ERROR: Could not load classifier cascade upperbody\n" );
fprintf( stderr, "Usage: facedetect --cascade=\"<cascade_path>\" [filename|camera_index]\n" );
return -1;
}
if( !cascade_face )
{
fprintf( stderr, "ERROR: Could not load classifier cascade face\n" );
fprintf( stderr, "Usage: facedetect --cascade=\"<cascade_path>\" [filename|camera_index]\n" );
return -1;
}
storage = cvCreateMemStorage(0);
capture = cvCaptureFromCAM(1);
cvNamedWindow( "result", 1 );
if( capture )
{
while(1) //for(;;)
{
/* cvGrabFrame (memegang dg kasar)
grab a frame, return 1 on success, 0 on fail.
this function is thought to be fast*/
/* get the frame grabbed with cvGrabFrame(..)
This function may apply some frame processing like
frame decompression, flipping etc.
/* Just a combination of cvGrabFrame and cvRetrieveFrame*/
/*
//jika frame tidak dipegang, break
if( !cvGrabFrame( capture ))
break;
//jika dipegang ambil frame tadi dengan cvRetrieveFrame
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 );
*/
IplImage* frame = cvQueryFrame( capture );
detect_and_draw(frame);
if( cvWaitKey( 10 ) >= 0 )
break;
}
cvReleaseImage( &frame_copy );
cvReleaseCapture( &capture );
}
cvDestroyWindow("result");
return 0;
}
void detect_and_draw( IplImage* img )
{
static CvScalar colors[] =
{
{{0,0,255}}, //biru
{{0,128,255}}, //biru muda
{{0,255,255}}, //sian
{{0,255,0}}, //hijau
{{255,128,0}}, //orange
{{255,255,0}}, //kuning
{{255,0,0}}, //merah
{{255,0,255}} //magenta
};
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_upperbody )
{
unsigned char a=0;
double t = (double)cvGetTickCount();
CvSeq* body = cvHaarDetectObjects( small_img, cascade_upperbody, storage, 1.1 , 2 , 0,cvSize(50, 50) );
t = (double)cvGetTickCount() - t;
//printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) );
for( i = 0; i < (body ? body->total : 0); i++ )
{
a=1;
CvRect* r = (CvRect*)cvGetSeqElem( body, i );
cvRectangle(img,cvPoint((r->x)*scale,(r->y)*scale),cvPoint((r->x + r->width)*scale, (r->y + r->height)*scale),cvScalar(255,255,0),2,8,0);
}
if (a==1)
{
//Menampilkan text pada layar
CvFont font;
cvInitFont( &font, CV_FONT_HERSHEY_SIMPLEX, 1.0, 1.0, 0, 1, 8);
cvPutText(img,"Badan depan terdeteksi",cvPoint(100,50),&font,CV_RGB(0,255,0));
//printf( "detected\n");
}
else
{
//diam
}
}
if( cascade_face)
{
unsigned char b=0;
CvSeq* face = cvHaarDetectObjects( small_img, cascade_face, storage, 1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING dan CV_HAAR_SCALE_IMAGE
*/,cvSize(30, 30) ); //Oke
for( i = 0; i < (face ? face->total : 0); i++ )
{
printf("face detected\n");
CvRect* r = (CvRect*)cvGetSeqElem( face, 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, cvScalar( 0,128,255), 3, 8, 0 );
b=1;
}
if (b==1)
{
//Menampilkan text pada layar
CvFont font;
cvInitFont( &font, CV_FONT_HERSHEY_SIMPLEX, 1.0, 1.0, 0, 1, 8);
cvPutText(img,"Wajah terdeteksi",cvPoint(100,100),&font,CV_RGB(0,255,0));
//printf( "detected\n");
}
else
{
//diam
}
}
cvShowImage( "result", img );
cvReleaseImage( &gray );
cvReleaseImage( &small_img );
}
VIDEO
Tidak ada komentar:
Posting Komentar