Deteksi dan Tracking Obyek Buatan XML Berbasiskan OpenCV

By : Mr. Widodo Budiharto

 

Metode pendeteksian wajah bermacam-macam. Salah satunya menggunakan metode yang dibangun oleh OpenCV yaitu cvHAAR. cvHaar adalah teknik modern yang memverifikasi roman wajah dimana menggunakan peniadaan latar belakang ( background subtraction ). Sejak metode ini lebih cepat dan akurat dibandingkan metode Lienhart dan lainnya, metode ini yang dipakai dalam implementasi sistem aktual. Kecepatan pendeteksian kurang dari 500ms.  Kita dapat mendeteksi berbagai macam obyek dengan membuat file XML sendiri, sebagai berikut :

 

HaarTraining

File xml dibuat dengan suatu training yang dikenal dengan Haar Training.  Proses training secara garis besar dapat dilihat dengan melalui bagan pada gambar di bawah. Folder aplikasi berada secara default di Program Files/OpenCV/bin/

 

Gambar Bagan Haar Training

Dapat dijelaskan sebagai berikut :

a.    Persiapan DataSet

Dataset terdiri dari 2 buah sample. Sample positif adalah gambar yang mengandung obyek yang akan dideteksi. Jika kita menginginkan wajah untuk dideteksi maka sample positif berisi gambar – gambar wajah. Sample negatif adalah gambar yang tidak mengandung obyek yang akan dideteksi. Seperti gambar pegunungan, mobil dsb. Masukkan sample positif pada 1 direktori, misalnya positiveSample/rawdata. Sedangkan sample negatif, dimasukkan pada /negativeSample. Sample paling minimal 10 buah untuk 1 wajah dalam berbagai pose.  Catatan: file gambar harus file *.bmp.

 

b.    Membuat infofile.txt untuk Sample Negative

Gunakan create_list.bat pada folder /negativeSample untuk mencatatkan nama file sample negative pada infofile.txt.

 

c.    Membuat info.txt untuk Sample Positive

Kemudian jalankan program objectmarker.exe pada folder positiveSample. Ketika program ini dijalankan, maka akan muncul satu per satu file dari sample positiveSample. Kemudian tandai obyek yang dimaksud dari gambar tersebut dengan menggerakkan kursor mouse membentuk sebuah box persegi panjang. Kemudian tekan spasi untuk menambahkan box tersebut, lalu tekan enter untuk beralih pada file gambar berikutnya. Kalau berhasil, maka info.txt akan berisi data gambar

d.    Membuat file vector.vec dari Sample Positive

Lalu kita gunakan tool createsamples.exe untuk mengubah obyek gambar ke  file vec. Jalankan perintah berikut pada dos command.

 

createsamples.exe -info positive/info.txt -vec data/vector.vec -num 18 -w 20 -h 20

 

Keterangan parameter tersebut dapat dilihat pada gambar .

Gambar  Keterangan Parameter dari Createsamples.exe

 

Maka bila hal ini telah berhasil dijalankan maka akan muncul  pada folder /data, file vector.vec

e.    Memulai HaarTraining

Setelah kita  punya file vector.vec maka kita mulai haartraining.

Jalankan program haartraining.exe di dos command:

 

haartraining.exe -data data/cascade -vec data/vector.vec -bg negativeSample/infofile.txt -npos 12 -nneg 2  -mem 1000 -mode ALL -w 20 -h 20 –nonsym

 

Keterangan parameter tersebut dapat dilihat pada gambar di bawah.

 

Keterangan Parameter dari haartraining.exe

 

lalu pada folder tools/temp/data/cascade maka akan muncul folder mulai dari 0 sampai N. Kemudian copy semua folder tersebut pada tools/cascade2xml/data.

 

f.     Membuat file *.xml

Jalankan haarconv.exe pada folder /cascade2xml di dos command sebagai berikut:

 

haarconv.exe data output.xml 20 20

 

Jika berhasil, maka akan muncul file output.xml pada folder  /cascade2xml.

 

Buatlah aplikasi demo tersebut menggunakan webcam berbasis Visual C++ .Net 2005.

 

 

// Demo Tracking Obyek

#include "stdafx.h"

#include "cv.h"

#include "highgui.h"

#include <stdio.h>

#include "capture.h"

#include "capture.c"

#include "facedet.h"

#include "facedet.c"

#include "camshift_wrapper.h"

#include "camshift_wrapper.c"

 

const char * DISPLAY_WINDOW = "DisplayWindow";

#define OPENCV_ROOT  "C:/Program Files/OpenCV"

 

 

//// Global variables

IplImage  * pVideoFrameCopy = 0;

 

 

//// Function definitions

int initAll();

void exitProgram(int code);

void captureVideoFrame();

 

 

// main()

//

void main( int argc, char** argv )

{

      CvRect * pFaceRect = 0;

      if( !initAll() ) exitProgram(-1);

 

      // Capture and display video frames until a face

      // is detected

      while( 1 )

      {

            // mencari wajah pada next frame

            captureVideoFrame();

            pFaceRect = detectFace(pVideoFrameCopy);

 

            // Tampilkan image

            cvShowImage( DISPLAY_WINDOW, pVideoFrameCopy );

            if( (char)27==cvWaitKey(1) ) exitProgram(0);

 

            // exit loop when a face is detected

            if(pFaceRect) break;

      }

 

      // initialize tracking

      startTracking(pVideoFrameCopy, pFaceRect);

 

      // Track the detected face using CamShift

      while( 1 )

      {

            CvBox2D faceBox;

            CvPoint facePoint;

 

            // ambil next frame video

            captureVideoFrame();

 

            // track wajah pada video frame

            faceBox = track(pVideoFrameCopy);

 

      // Bentuk elips

      cvEllipseBox(pVideoFrameCopy, faceBox,

CV_RGB(50,255,0), 2, CV_AA, 0 );

      cvShowImage( DISPLAY_WINDOW, pVideoFrameCopy );

                  if( (char)27==cvWaitKey(1) ) break;

      }

 

      exitProgram(0);

}

 

 

int initAll()

{

      if( !initCapture() ) return 0;

     

            if( !initFaceDet(OPENCV_ROOT

            "/data/haarcascades/output.xml"))

            return 0;

 

 

      //  Buat jendela display

      cvNamedWindow( DISPLAY_WINDOW, 1 );

 

      // Initialize tracker

      captureVideoFrame();

      if( !createTracker(pVideoFrameCopy) ) return 0;

 

      // Set Camshift parameters

      setVmin(60);

      setSmin(50);

 

      return 1;

}

 

 

void exitProgram(int code)

{

      // Release resources allocated in this file

      cvDestroyWindow( DISPLAY_WINDOW );

      cvReleaseImage( &pVideoFrameCopy );

 

      // Release resources allocated in other project files

      closeCapture();

      closeFaceDet();

      releaseTracker();

 

      exit(code);

}

 

void captureVideoFrame()

{

      printf ("Data : %d\n");

      // Capture the next frame

      IplImage  * pVideoFrame = nextVideoFrame();

      if( !pVideoFrame ) exitProgram(-1);

 

      // Copy it to the display image, inverting it if needed

      if( !pVideoFrameCopy )

            pVideoFrameCopy = cvCreateImage( cvGetSize(pVideoFrame), 8, 3 );

      cvCopy( pVideoFrame, pVideoFrameCopy, 0 );

      pVideoFrameCopy->origin = pVideoFrame->origin;

 

      if( 1 == pVideoFrameCopy->origin ) // 1 means the image is inverted

      {

            cvFlip( pVideoFrameCopy, 0, 0 );

            pVideoFrameCopy->origin = 0;

      }

}

 

 

                                Hasil program menggunakan file XML yang berhasil dibuat

Info lebih lanjut hubungi widodo@widodo.om HP: 081410043883.

Referensi : www.sourceforge.net/projects/OpenCV