"Orang berilmu binasa kecuali orang yang mengamalkan ilmunya. Orang yang mengamalkan ilmunya binasa kecuali orang yang ikhlas". (Ibnu Qudamah)

Selasa, 28 Juli 2015

Face and Body Detection


http://crcv.ucf.edu/data/ParkingLOT/index.php_files/Vision6.jpg
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 );

}
VIDEO



Anda bisa juga mendeteksi mulut dan hidung dengan menggunakan Mouth.xml dan Nose.xml. Filenya dapat anda download pada link nama filenya. 

Tidak ada komentar: