Thursday, December 3, 2015

Memahami Peta Karnaugh (2)

Pendahuluan

Pada tutorial sebelumnya, kita telah mempelajari Peta Karnaugh untuk 2, 3 dan 4 peubah (variable). Kesempatan ini kita akan mempelajari Peta Karnaugh untuk 5 dan 6 peubah. Walaupun 5 dan 6 variable sangat jarang digunakan, ada baiknya kita perlu mengetahui bagaimana Peta Karnaugh 5 dan 6 peubah tersebut.

Peta Karnaugh (2, 3 dan 4 Peubah)

Pada tutorial sebelumnya (pada 2, 3 dan 4 variable) kita juga sudah mempelajari daerah minterm yang selanjutnya kita sebut satu daerah kudran. Sebagai contoh:

Gambar Peta Karnaugh 2, 3 dan 4 Peubah

Peta Karnaugh 5 dan 6 Peubah

Sedikit berbeda dengan Peta Karnaugh 2, 3 dan 4 peubah, peta Karnaugh 5 dan 6 peubah, kita menggambar daerah kuadran. Peta Karnaugh dengan 5 peubah memiliki 2 daerah kudran dan 6 peubah memiliki 4 daerah kuadran. Perhatikan contoh:

Gambar Peta Karnaugh 5 Peubah

Untuk Peta Karnaugh 6 peubah seperti berikut:

Gambar Peta Karnaugh 6 Peubah

Yang perlu diperhatikan, pemberian label Peta baik baris maupun kolom, tetap menggunakan aturan perubahan di satu tempat dan aturan ini berlaku berputar. Perhatikan tanda panah pada gambar berikut:

Gambar Aturan Perubahan di Satu Tempat Berputar

Selesai. Kita telah bisa menggambar Peta Karnaugh 5 dan 6 Peubah. Setelah kita dapat menggambar Peta Karnaugh 5 dan 6 Peubah, saatnya kita menentukan Daerah Minterm Peta Karnaugh tersebut.

Daerah Minterm

Peta K, dipandang sebagai peta berbentuk bundar (seperti Globe) seperti diilustrasikan pada gambar berikut:
Gambar Ilustrasi Peta Karnaugh

Daerah minterm adalah daerah angka 1 yang bertetangga. Seperti daerah minterm pada Peta Karnaugh 2, 3 dan 4 peubah yang sudah kita pelajari sebelumnya, daerah minterm dapat dibentuk dengan 2^n, dimana n=0,1,2, dst. Berarti daerah minterm dapat berisi kelompok angka 1 yang bertetangga dengan jumlah 1, 2, 4, 8 dst.

Pada Peta Karnaugh dengan 5 atau 6 peudah dimana terdapat lebih dari 1 daerah kuadran, kita dapat membuat daerah minterm debagai mini Globe. Artinya satu daerah kuadran sebagai 1 Globe kecil. Dua Daerah kuadran juga seperti mini Globe.
Ingat, semakin banyak anda dapat mengelompokkan angka 1 dalam suatu daerah minterm, akan semakin sederhana persamaan logika yang anda peroleh.

Perhatikan beberapa contoh daerah minterm pada Peta Karnaugh 6 peubah berikut.

Gambar Daerah Minterm Untuk 6 Peubah

Untuk 5 peubah, dapat dipahami sendiri. :)

Untuk penulisan formula, lihat konsep konsistensi yang telah kita pelajari sebelumnya.

Studi Kasus

Setelah kita pahami pembuatan Peta Karnaugh dan Daerah Minterm, saatnya kita coba dalam studi kasus 6 peubah.

Kita transformasikan kasus di atas dalam peta K sebagai berikut:


Gambar Peta K dan Minterm Area

Dari daerah minterm di atas:
  1. Coklat: A'CX'Y'Z'
  2. Merah: BX'Y'
  3. Ungu: ABCYZ'
  4. Biru Tua: ABY'
  5. Orange: ACY'Z'
Sehingga formula logika: A'CX'Y'Z' +BX'Y' + ABCYZ' + ABY' + ACY'Z'
Pembuktian dengan table kebenaran:

 Gambar Pembuktian Formula dengan Tabel Kebenaran

Mudah bukan? Selamat mencob. Semoga bermanfaat..

Sunday, October 25, 2015

Object Detection: Membuat Classifier Anda Sendiri

Pendahuluan

Pada tutorial sebelumnya, kita sudah belajar bagaimana mendeteksi obyek mobil dengan Haarcascade Classifier. Pada tulisan ini, kita akan belajar bagaimana membuat classifier kita sendiri dengan kasus "Deteksi Compact Disk". Diharapkan setelah mempelajari tutorial ini, anda dapat menentukan sendiri obyek apapun yang akan anda deteksi.

Persiapan 
Software yang saya gunakan adalah:
  1. Visual Studio 2010 
  2. library OpenCV 2.4.11.
  3. ObjectMarker
  4. Cascade2xml

Langkah-langkah:

Berikut adalah langkah-langkah pembuatan classifier. Sesuaikan sendiri dengan path direktori anda.

1. Step: Pembuatan list negatif

Buat list foto background (negatif) yang sudah dalam format JPG dan greyscale dengan perintah: dir /b > negatif.txt dan jangan lupa bersihkan file negatif.txt dari dirinya sendiri (karena kata "negatif.txt" ada di dalamnya). Pastikan isi negatif.txt hanya daftar JPG gambar negatif anda. Lihat pada Gambar 1 berikut:

 
Gambar 1: Proses pembuatan list gambar negatif

2. Step: Pemberian fullpath gambar negatif

Berikan FullPath untuk setiap foto negatif yang sudah dibuat (gunakan file list_neg.bat) dengan perintah:

(for /F "delims=" %%L in (neg.txt) do @echo D:\DataJati\belajar_image_processing\negatif\jpg\%%L)>> negNew.txt

Edit lebih dulu dan sesuaikan folder path anda. Pada contoh gambar 2, saya meletakkan file background (negatif) di path: D:\DataJati\belajar_image_processing\negatif\jpg. Sesuaikan dengan path anda masing-masing.


Gambar 2: Proses pemberian fullpath gambar negatif

3. Step: Pembentukan file negNew.txt

Gambar 3 menunjukkan isi file negatif yang lengkap dengan fullpath-nya

Gambar 3: File negNew.txt

4. Step: Persiapan file positif

File positif adalah file yang nantinya menjadi acuan pendeteksian obyek. Kita sebenarnya akan melatih sistem untuk mengenali obyek seperti obyek yang terlihat di file positif ini. Pindahkan file positif anda ke direktori rawdata dengan mengubah format menjadi BMP. Path image rawdata saya ada di D:\DataJati\belajar_image_processing\CD_Tracking\img\rawdata\. Proses pemindahan ke folder rawdata ini wajib karena aplikasi objectmarker.exe di langkah 5 membutuhkannya.

Gambar 4: File positif dalam format BMP

5. Step: Pembuatan object info

Penandaan obyek dengan file objectmarker.exe. Penandaan obyek dimaksudkan untuk menandai area obyek yang akan dideteksi dalam gambar positif. File objectmarker ini saya letakkan di folder yang sama dengan file lainnya seperti terlihat pada Gambar 5 untuk memudahkan saja. Aplikasi objectmarker dapat didownload di sini.

Gambar 5: Aplikasi objectmarker

Saat aplikasi objectmarker dijalankan, anda akan diminta untuk "menandai" sebuah area yang merupakan obyek terdeteksi. Perhatikan gambar 5a. Pada gambar 5a, saya menandai CD di tangan saya, yang otomatis dicatat rawdata area tersebut (gambar 5b).

 Gambar 5a: Proses pembuatan rawdata (1)

Gambar 5b: Proses pembuatan rawdata (2)

6. Step: Terbentuk file info.txt

File info.txt ini berisi rawdata dari sample yang berasal dari gambar positif dari proses tahap 5. Gambar 6 menunjukkan isi rawdata dan bisa berbeda dengan rawdata anda.

Gambar 6: File info.txt yang berisi rawdata gambar positif

7. Step: Replace karakter

Ganti slash (/) menjadi backslash (\) mengikuti format direktori di Sistem Operasi Windows.

Gambar 7: Replace karakter / menjadi \

8. Step: Full Path untuk file info.txt (rawdata)

Proses ini diperlukan untuk memberikan fullpath di file info.txt anda menjadi file positif.txt

Gambar 8a: Proses pemberian full path untuk setiap rawdata

File positif ditunjukkan pada Gambar 8b sebagai berikut:



9. Step: Pembuatan file vector (*.vec)

Buat file VEC menggunakan create_sample_command.bat. Sesuaikan parameter num sesuai jumlah file positif anda (lihat langkah 8). Yang perlu menjadi perhatian adalah parameter lebar dan tinggi (w dan h) disesuaikan dengan langkah 13. Perhatikan gambar 9a. Gambar 9b menunjukkan proses eksekusi createsample.

Gambar 9a: Pembuatan file vector

Proses eksekusinya ditunjukkan pada Gambar 9b sebagai berikut:


  Gambar 9b: Proses pembentukan file vector

10. Step: Terbentuk file vector

Gambar 10 menunjukkan telah terbentuk file samples.vec

Gambar 10: File samples.vec

11. Step: Pembuatan classifier

Pada tahap ini, kita akan membuat classifier XML yang masih terpisah-pisah (belum kita satukan) sebanyak jumlah stage yang tentukan. Pertama kita buat dulu direktori classifier yang akan menampung classifier kita. Perhatikan gambar 11a.

Gambar 11a: Pembuatan tempat penampungan (direktori) classifier

Kemudian kita buat perintah untuk membuat classifier. Perhatikan gambar 11b

Gambar 11b: Perintah haartraining

Pada gambar 11b, saya menulisnya dengan enter agar tidak terlalu panjang saja. :)
Proses training-nya ditunjukkan pada gambar 11c sebagai berikut:

Gambar 11c: Proses Training

12. Step: Terbentuk training cascade

Pada tahap ini telah terbentuk file cascade yang berada di direktori classifier

 Gambar 12: Training Cascade

13. Step: Penyatuan file cascade menjadi cascade classifier lengkap

Pada tahap ini, kita akan menyatukan training cascade di langkah 12 supaya menjadi cascade classifier lengkap yang nantinya akan kita panggil di source code. Saya menggunakan tools convert cascade2xml yang dapat didownload di sini
Pertama kita pindahkan dulu isi classifier kita ke direktori data di aplikasi cascade2xml seperti pada gambar 13a.

 Gambar 13a: Pemindahan classifier ke data

Gambar 13b menunjukkan perintah konversi cascade2xml (perhatikan parameter h dan w-nya). Sesuaikan dengan langkah 9. Data merupakan direktori tempat classifier yang sudah kita pindahkan.

Gambar 13b: Proses penyatuan

Output dari cascade2xml adalah output.xml seperti ditunjukkan gambar 13a. File output inilah yang nanti dipanggil pada source pendeteksian obyek anda.

Implementasi

Setelah file classifier sudah kita dapatkan, berikut adalah source code pendeteksian obyek dalam file CPP.

#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;

void deteksi_tampilkan( Mat frame );

String cascade_name = "E:\\cascade2xml\\output.xml";
CascadeClassifier cd_cascade;

string window_name = "Tampilkan - Deteksi Obyek";

int main( )
{
   CvCapture* ambilVideo;
   Mat frame;

   //-- 1. Panggil cascade

if( !cd_cascade.load( cascade_name ) ){ printf("--(!)Error loading\n"); system("PAUSE"); return -1; };

   //-- 2. Baca video

ambilVideo = cvCaptureFromCAM( 0 );
   if (!ambilVideo) {
       printf("Tidak dapat memanggil Kamera");
   }
   else
   {
       printf("Panggil Camera Sukses");
   }

   if( ambilVideo )
   {
     while( true )
     {
   frame = cvQueryFrame( ambilVideo );

   //-- 3. Terapkan classifier ke Frame Video

  
     if( !frame.empty() )
       { deteksi_tampilkan( frame ); }
       else
       { printf(" --(!) Tidak ada Frame -- Berhenti!"); break; }

       int c = waitKey(10);
       if( (char)c == 'c' ) { break; }
      }
   }
   return 0;
 }

//-- Fungsi deteksi_tampilkan

void deteksi_tampilkan( Mat frame )
{
  std::vector<Rect> obyek;
  Mat frame_gray;

  cvtColor( frame, frame_gray, CV_BGR2GRAY );
  equalizeHist( frame_gray, frame_gray );

  //-- Deteksi obyek

cd_cascade.detectMultiScale( frame_gray, obyek, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );

  for( size_t i = 0; i < obyek.size(); i++ )
  {
    Point center( obyek[i].x + obyek[i].width*0.5, obyek[i].y + obyek[i].height*0.5 );
    ellipse( frame, center, Size( obyek[i].width*0.5, obyek[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
  }

  //-- Tampilkan Pendeteksian
imshow( window_name, frame );
}

Hasil


Note:
Penting untuk menjadi perhatian, banyaknya file positif, negatif dan jumlah stage dalam proses training akan sangat berpengaruh pada ketepatan pendeteksian obyek yang anda lakukan. Permasalahannya, semakin banyak file positif, negatif dan jumlah stage akan memperpanjang waktu yang diperlukan untuk melakukan haartraining. Jadi siapkan cemilan dan tempat duduk yang nyaman saat melakukan haartraining.

Referensi

https://www.cs.auckland.ac.nz/~m.rezaei/Tutorials/Creating_a_Cascade_of_Haar-Like_Classifiers_Step_by_Step.pdf

Selamat mencoba

Wednesday, October 7, 2015

Teknik Digital: Algoritma Booth Untuk Perkalian Dua Bilangan Biner Integer Bertanda

Pendahuluan:

Asumsinya pertama kita sudah mengetahui operasi aritmatika dasar (tambah, kurang, kali dan bagi) untuk bilangan biner integer. Sebagai contoh :

Operasi penjumlahan:

Operasi pengurangan

Operasi perkalian


Operasi pembagian


Asumsi kedua kita juga sudah mengetahui representasi bilangan negatif biner dengan komplemen 2. Sebagai contoh:

-10 (desimal) = 10110 (biner 5 bit)

Saat ini kita akan menggunakan Algoritma Booth untuk perkalian bilangan biner bertanda (signed binary multiplication) karena perkalian bilangan biner bertanda tidak semudah biasanya. :)

Sebelum kita masuk ke algoritma, ada baiknya kita samakan terlebih dulu istilah yang nanti saya gunakan. Jika saya ingin melakukan operasi aritmatika: 6 * -7 maka:

Multiplikan = 6
Multiplier = -7

Algoritma

Algoritma booth adalah sebuah proses iterasi dimana jumlah iterasinya sama dengan jumlah bit yang kita gunakan dalam representasi bilangan biner. Sebagai contoh jika kita memiliki angka -7 dalam desimal dan kita menggunakan 11001 sebagai bilangan binernya, berarti kita menggunakan 5 bit sehingga jumlah iterasi nantinya adalah 5x.

Algoritma Booth ini menggunakan 4 variabel yaitu
  1. Produk
  2. Bit terakhir produk (product's last bit)
  3. Bit terakhir produk sebelumnya (product's previous last bit)
  4. Action
Keterangan:
  • Variabel produk terdiri dari 2 bagian yaitu nilai kiri (left side) dan nilai kanan (right side). Nilai kiri produk nantinya berisi nilai yang akan di "operasi" dengan penjumlahan atau pengurangan dengan multiplikan sedangkan nilai kanan berisi multiplier. Jumlah bit antara left side dan right side harus sama. 
  • Product's last bit (untuk selanjutnya disingat Last Bit) adalah nilai least significant bit (LSB) atau nilai bit paling kanan dari product. Misalnya nanti product memiliki nilai 11010 11001, maka nilai Last bit sama dengan 1. 
  • Product's previous last bit (selanjutnya disingkat Previous Bit) adalah nilai last bit pada iterasi sebelumnya.
  • Setiap kenaikan proses iterasi,  nilai bit produk akan digeser (shifted) ke kanan.
  • Action: Nilai aksi ini tergantung pada susunan last bit dan previous bit di masing-masing iterasi sebagai berikut:
  • 00 : Tidak ada aksi apa-apa
  • 01 : tambahkan bit pada left side product dengan multiplikan
  • 10 : kurangi bit pada left side product dengan multiplikan
  • 11 :  Tidak ada aksi apa-apa
Studi Kasus

Setelah kita memahami langkah-langkah pada algoritma booth, saatnya kita coba implementasi Algoritma Booth pada perkalian bilangan biner bertanda.

Kasus I
Kasus yang akan kita gunakan adalah 6 * -7 (dalam desimal).

Multiplikan : 6 (desimal) = 00110 (biner)
Multiplier : -7 (desimal) = 11001 (biner)
Bantu : -6 (desimal) = 11010 (biner)

Contoh di atas menggunakan representasi 5 bit yang berarti ada 5 iterasi algoritma booth. Angka bantu di sini digunakan untuk membantu aksi saat susunan last bit dan previous bit adalah 1 dan 0.

Perhatikan gambar di bawah ini:
Penjelasan proses penambahan dan pengurangan left side produk dengan multiplikan di Step 1 ke Step 1a dan dari Step 3 ke Step 3a

Penjumlahan produk dengan multiplikan:

Pengurangan produk dengan multiplikan (saya menggunakan teknik penjumlahan dengan angka bantu):

Kasus II: 
9 * -7 dengan 6 bit bilangan biner. Karena menggunakan 6 bit, maka ada 6 step iterasi Algoritma Booth.

Multiplikan : 9 (desimal) = 001001 (biner)
Multiplier : -7 (desimal) = 111001 (biner)
Bantu : -9 (desimal) = 110111 (biner)

Perhatikan tabel berikut:

Semoga Bermanfaat

Thursday, September 17, 2015

Deteksi Obyek Menggunakan Haar Cascade Classifier

Pendahuluan

Pendeteksian obyek sangat mudah dilakukan oleh manusia tetapi merupakan tantangan tersendiri oleh sistem berbasis computer vision. Pada dasarnya pengembangan keilmuan computer vision adalah meniru bagaimana manusia melihat (human vision). Akan tetapi proses peniruan ini melibatkan studi yang sangat komplek. Manusia melihat melalui mata yang kemudian dibawa ke otak untuk diterjemahkan atau dikenali (Pambudi & Simorangkir, 2012). Telah cukup banyak penelitian yang membahas mengenai sistem berbasis computer vision diantaranya pengolahan citra, neural network, statistik, pengenalan pola, anthropometry dan computer vision (Padilla, Filho, & Costa, 2002). Hasil pendeteksi ini dapat dikembangkan pada aplikasi-aplikasi yang lain. Sebagai contoh pengenalan wajah atau pola, menghitung jumlah pengunjung atau penghitung jumlah kendaraan di jalan raya yang kemudian dapat dilanjutkan sebagai pendukung keputusan terkait prosedur standar yang akan diterapkan.

Pada awalnya deteksi obyek dilakukan menggunakan metode-metode deteksi tepi seperti Sobel, Prewitts atau Canni. Deteksi tepi dengan metode-metode tersebut sangat menguras sumber daya karena tingginya komputasi yang dilakukan picture element (pixel) demi pixel (Sajati & Astuti, 2013).  Penggunaan deteksi tepi untuk pendeteksian obyek tidak efektif pada obyek bergerak seperti dalam format video dimana pergerakan frame dalam sebuah video dapat mencapai 20 frame per detik (fps). Metode deteksi tepi juga tidak efektif untuk diterapkan sebagai sistem pendeteksian obyek pada object tracking atau fast object tracking. 

Haar-Like Feature

Haar like Feature merupakan metode yang lazim digunakan dalam pendeteksian obyek. Nama Haar sendiri mengacu pada Haar Wavelet, sebuah fungsi matematika yang berbentuk kotak dan memiliki prinsip seperti pada fungsi Fourier.  (Purwanto, Dirgantoro, & Jati, 2015). Haar-like features merupakan rectangular features (fungsi persegi), yang memberikan indikasi secara spesifik pada sebuah gambar atau image. Prinsip Haar-like features adalah mengenali obyek berdasarkan nilai sederhana dari fitur tetapi bukan merupakan nilai piksel dari image obyek tersebut. Metode ini memiliki kelebihan yaitu komputasinya sangat cepat, karena hanya bergantung pada jumlah piksel dalam persegi bukan setiap nilai piksel dari sebuah image (Viola, Paul, & Jones, 2001).
Deteksi obyek kendaraan pada penelitian ini merupakan pemodifikasian sistem Haar-like features dari deteksi wajah yang pertama kali dilakukan oleh Viola dan Jones kemudian dikembangkan oleh Lienhart (Viola, Paul, & Jones, 2001) (Lienhart, Rainer, & Maydt, 2002). Metode yang diusulkan Viola dan Jones menggabungkan empat kunci utama untuk mendeteksi sebuah obyek (Viola, Paul, & Jones, 2001):
  1. Fitur persegi sederhana, disebut fitur Haar
  2. Integral image untuk pendeteksian fitur dengan cepat
  3. Metoda AdaBoost machine-learning
  4. Cascade classifier untuk mengkombinasikan banyak fitur
Haar like feature memproses citra dalam sebuah kotak persegi dengan ukuran tertentu misalnya 24 x 24 pixel seperti ditunjukkan pada gambar 1 sebagai berikut:

Gambar 1. Rectangular Feature Haar Cascade


Di dalam kotak inilah proses filtering obyek dilakukan untuk diketahui apakah ada atau tidak obyek yang akan dideteksi. Proses filterisasi ini dilakukan secara bertingkat yang menyebabkan metode ini nantinya disebut sebagai Haar Cascade Classifier seperti ditunjukkan pada skema filter di gambar 2 sebagai berikut:
Gambar 2. Skema Pendeteksi Obyek


Hasil deteksi Haar-like Feature kurang akurat jika hanya menggunakan satu fungsi saja. Semakin tinggi tingkatan filter pendeteksian maka semakin tepat pula sebuah obyek dideteksi akan tetapi akan semakin lama proses pendeteksiannya. Pemrosesan Haar-like feature yang banyak tersebut diatur dalam classifier cascade.
Haar-Wavelet (Wave = Gelombang) merupakan gelombang persegi (interval gelap dan interval terang) yang kemudian dibandingkan nilai rata-rata pixel keduanya. Apabila perbandingan nilai rata-rata intensitas tersebut berada di atas threshold (ambang batas), maka dikatakan memenuhi syarat fitur Haar. Untuk gambar bergerak seperti video, proses ini dilakukan secara diskrit dengan mencuplik video pada frame rate tertentu. Macam-macam variasi Haar-like feature ditunjukkan pada gambar 3 sebagai berikut (Pavani, Delgadoa, & Frangia, 2010):

  Gambar 3 Berbagai variasi persegi Haar dengan Bobot Standar Persegi Panjang

Keterangan gambar 3 (Pavani, Delgadoa, & Frangia, 2010):

a, b : Fitur Haar yang diusulkan Papageogiou dkk.
c : Fitur Haar yang diusulkan Viola dan James
d, e, f : Variasi fitur Haar yang diusulkan Leinhardt
g, h : Penguraian Lietal terhadap Fitur Haar-like
i : Fitur Haar-like Viola dan James untuk menangkap struktur diagonal dalam penampilan obyek

Perhitungan nilai fitur Gambar 3 di atas ditunjukkan pada Gambar 4 dan formula (1) sebagai berikut:

Gambar 4. Fitur Persegi Haar-like

NilaiFitur(ABFE) = JumlahNilaiPixel(ABDC)-JumlahNilaiPixel(CDFE) ....... (1)

Apabila NilaiFitur(ABFE) memiliki nilai di atas threshold maka dikatakan memenuhi syarat. Seperti dijelaskan pada gambar 2, apabila sebuah fitur dikatakan tidak memenuhi syarat, maka area ABFE tidak terdapat obyek yang dideteksi dan area perseginya berpindah lokasi akan tetapi jika persegi ABFE memenuhi fitur, maka aturan fitur berikutnya dilakukan. Jika semua syarat fitur dipenuhi dikatakan pada persegi ABFE dikatakan terdapat obyek.
Proses pendeteksian mobil menggunakan Haar-like feature ditunjukkan pada Gambar 5 sebagai berikut:
 Gambar 5. Pendeteksian Kendaraan dengan Haar-like Feature

Integral image

Sebuah citra digital memiliki komponen nilai RGB (kombinasi dari warna merah, hijau dan biru). Dari nilai RGB tersebut dapat diketahui nilai grayscale (derajat keabu-abuan) yang dihitung menggunakan formula (2) sebagai berikut:

Grayscale_pixel = 0.2989R + 0.5870G + 0.1140B  ....................................................... (2)

Sebagai contoh sebuah pixel memiliki kombinasi warna R=100, B=100 dan G=100 maka nilai grayscale menurut formula 2 di atas sama dengan 99.99. Sebuah citra yang dirubah menjadi grayscale ditunjukkan pada gambar 6 sebagai berikut:

 Gambar 6. Perbedaan Citra Asli dengan Grayscale

Proses pendeteksian obyek ditunjukkan pada diagram alir di Gambar 7 sebagai berikut:

Gambar 7. Pendeteksian Obyek dengan Haar Cascade Clasifier

Pertama, ditentukan terlebih dahulu area yang akan dideteksi apakah terdapat obyek atau tidak. Proses berikutnya adalah melakukan pendeteksian obyek menggunakan Haar Cascade Clasifier dengan langkah-langkah yang akan dijelaskan sebagai berikut.
Citra integral adalah sebuah citra yang nilai tiap pixel-nya merupakan penjumlahan nilai pixel atas dan kirinya. Sebagai contoh pada gambar 5 (c) sebuah daerah persegi yang akan di-scan menggunakan persegi gelap terang memiliki nilai sebagai berikut: 
Gambar 8 Citra Masukan

 Pada citra masukan yang diberi persegi pada gambar 5 (c) terlihat pada gambar 9 sebagai berikut:
 

Gambar 9 Persegi Haar Like Pada Citra masukan

Proses perhitungan nilai gelap dan nilai terang di formula 1 menghasilkan nilai Fitur Haar sama dengan 22. Untuk menghitung Fitur nilai Haar menggunakan Summed Area Table atau yang dikenal sebagai Integral image, pertama dibentuk matriks nilai integral image.
 
Proses integral image matriks citra ditentukan menggunakan formula (3) sebagai berikut:
 
s(x,y)=i(x,y)+s(x-1,y)+s(x,y-1)-s(x-1,y-1) ...................................................................... (3)

Dimana x-1 dan y-1 adalah pixel tetangga dari pixel yang akan dihitung seperti terlihat pada gambar 10 sebagai berikut:
Gambar 10 Pixel Tetangga pada Proses Integral image

Menggunakan formula 3 di atas, integral image dari citra masukan di Gambar 6 terlihat pada gambar 11 sebagai berikut:
 Gambar 11 Matriks Integral Image dari Citra Masukan

Nilai fitur Haar dari area matriks di gambar 11 dihitung menggunakan formula (4) sebagai berikut:
 
i(x',y')=s(A)+s(D)+s(B)-s(C) .......................................................................................... (4)
 
Sehingga:
fitur nilai Haar    = (32+2-16-5)-(49+5-32-6)+(77+6-49-9) = 22
 
Hasil ini sesuai dengan perhitungan secara manual menggunakan formula 1. Nilai 22 tersebut kemudian dibandingkan dengan threshold yang sudah ditentukan sebagai pendeteksian obyek. Apabila nilai fitur Haar lebih tinggi daripada threshold, maka dapat dikatakan pada area tersebut memenuhi filter Haar. Sesuai flowchart pada gambar 2, proses ini akan dilanjutkan untuk menguji kembali area tersebut dengan filter Haar yang lain dan apabila seluruh filter Haar terpenuhi maka dikatakan pada area tersebut terdapat obyek yang diamati.   

Implementasi 
Deklarasi Global Variable
Pada bagian ini ditentukan file XML beserta lokasi dari Cascade Classifier. Tata tulis (syntax) deklarasi Cascade Classifier adalah sebagai berikut:
 
CascadeClassifier::CascadeClassifier(const string& filename) 
Berikut petikan programnya:

String cars_cascade_name = "E:/master/opencv/sources/data/haarcascades/cars3.xml";
CascadeClassifier cars_cascade;

 
File cars3.xml ini ditulis oleh Tomas Uktveris (Uktveris, 2012).

Fungsi Pendeteksian Dan Penampil Obyek
Fungsi ini digunakan untuk mendeteksi dan menampilkan obyek kendaraan dari setiap frame yang ditangkap oleh IP Camera menggunakan cascade classifier yang telah dideklarasikan sebelumnya. Syntax pendeteksian obyek adalah sebagai berikut:
 
void CascadeClassifier::detectMultiScale(const Mat& image, vector<Rect>& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size())

dimana:
cascade : Merupakan Haar Cascade Classifier. Classifier yang dipanggil dari XML atau YAML menggunakan fungsi “load”.
Image : Berisi citra yang akan dideteksi obyeknya
Object : Sebuah vektor persegi dimana sebuah obyek yang terdeteksi akan ditandai
scaleFactor : Parameter yang menspesifikasikan rasio pengurangan citra
minNeighbors    :    Parameter yang menspesifikasikan jumlah tetangga persegi yang dipertahankan
minSize : Nilai minimal ukuran obyek. Obyek-obyek dengan ukuran lebih kecil dari nilai ini, akan diabaikan.
maxSize : Nilai maksimal ukuran obyek. Obyek-obyek dengan ukuran lebih besar dari nilai ini akan diabaikan.

Fungsi deteksi dan penampil adalah sebagai berikut: void detectAndDisplay( Mat frame )
{
std::vector<Rect> cars;
cv::Mat frame_gray;

cvtColor( frame, frame_gray, CV_BGR2GRAY );
equalizeHist( frame_gray, frame_gray );

cars_cascade.detectMultiScale( frame_gray, cars, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30));

for( size_t i = 0; i < cars.size(); i++ )
{
Point center( cars[i].x + cars[i].width*0.5, cars[i].y + cars[i].height*0.5 );
ellipse( frame, center, Size( cars[i].width*0.5, cars[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
}

cv::imshow( window_name, frame );
}

Fungsi ini nantinya akan dipanggil di setiap stream frame yang telah di-parsing dari IP Camera.

Membuka Koneksi Dengan IP Camera   
Tahapan pertama dalam proses deteksi kendaraan adalah membuka koneksi ke IP camera. Protokol yang digunakan adalah Real Time Streaming Protocol (RTSP). Petikan kode program berikut adalah proses inisialisasi IP Camera menggunakan protokol RTSP:

CvCapture* capture = cvCaptureFromFile("rtsp://192.168.1.1/MJPG?Q=50&BR=3000000");
Pada bagian ini dapat dilengkapi dengan pengujian apakah IP Camera sudah siap atau belum.
 
if (capture==NULL) {
           printf("video is not ok\n");
           system("PAUSE");
}
else
            printf("video is ready\n");


Memanggil Cascade Classifier
Bagian ini digunakan untuk memanggil file cascade classifier yang telah dideklarasikan pada global variable. Berikut petikan programnya:
 
if( !cars_cascade.load( cars_cascade_name ) )
{
    printf("--(!)Error loading\n"); system("PAUSE");
    return -1;
};
   
Baca Video Stream IP Camera 
Proses berikutnya adalah membaca stream dari video yang ditangkap oleh IP Camera. Berikut adalah petikan programnya:
 
   if( capture )
   {
     while( true )
     {
        frame = cvQueryFrame( capture );
        if( !frame.empty() )       {
           detectAndDisplay( frame );
         }
           else  {
        printf(" --(!) Tidak ada frame yang terbaca -- Break!");
        break; }
       int c = waitKey(10);
           if( (char)c == 'c' ) { break; }
               }
          }

Menghitung Jumlah Kendaraan


Pada bagian ini, dijelaskan algoritma proses perhitungan obyek kendaraan:
  1. Tentukan center point dari obyek yang berhasil dideteksi oleh cascade classifier
  2. Tentukan area perhitungan. Area perhitungan adalah sebuah area semu yang menjadi area perhitungan setiap obyek yang melewatinya.
  3. Apabila terdapat center point yang berada di area tersebut maka object counter akan bertambah satu (increment).
  4. Apabila frame video sudah habis, pindahkan nilai perhitungan tersebut ke dalam sebuah file teks untuk kemudian diproses oleh penentu keputusan perhitungan.
Berikut adalah petikan program perhitungan obyek kendaraannya:
 
    Point center( cars[i].x + cars[i].width*0.5, cars[i].y + cars[i].height*0.5 );
    cv::line( frame, Point(0,100), Point(400,100), Scalar(255,0,0), 2, 8, 0);
   
    //cout << "Point y : " << cars[i].y << endl;
    if (cars[i].y > 90 && cars[i].y < 115)
{
        cv::ellipse( frame, center, Size( cars[i].width*0.5, cars[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
    jumlah++;
    cout << "Hitung ke : "<< jumlah << endl;
    }
   
Pada potongan kode di atas, area semu (area perhitungan) berada pada sumbu y > 90 dan sumbu y <= 115 seperti terlihat pada gambar 12 sebagai berikut:
 
Gambar 12 Proses Perhitungan Kendaraan

Pada gambar 12 di atas, dapat dihitung jumlah kendaraan yang melewati area pendeteksian. Tutorial berikutnya akan kita pelajari bagaimana membuat classifier kita sendiri.

DAFTAR PUSTAKA
Lienhart, Rainer, & Maydt, J. (2002). An extended set of haar-like features for rapid object detection. In: IEEE ICIP 2002, Vol.1, (pp. 900-903).

Padilla, R., Filho, C. F., & Costa, M. G. (2002). Evaluation of Haar Cascade Classifiers Designed for Face Detection. World Academy of Science, Engineering and Technology Vol:6 2012-04-22 .

Pambudi, W. S., & Simorangkir, B. M. (2012). Facetracker Menggunakan Metode Haar Like Feature Dan PID Pada Model Simulasi. Jurnal Teknologi dan Informatika (TEKNOMATIKA) .

Pavani, S.-K., Delgadoa, D., & Frangia, A. F. (2010). Haar-like Features with Optimally Weighted Rectangles for Rapid Object Detection. The Journal of the Pattern Recognition Society , 160-172.

Purwanto, P., Dirgantoro, B., & Jati, A. N. (2015). Implementasi Face Identification Dan Face Recognition Pada Kamera Pengawas Sebagai Pendeteksi Bahaya. Universitas Telkom .

Sajati, H., & Astuti, Y. (2013). Analisis dan Perancangan Software untuk Menentukan Kendaraan Gelap dan Terang . Jurnal Angkasa STTA Vol V / No. 2 / November 2013 ISSN: 2085-9503 .

Santoso, H., & Harjoko, A. (2013). Haar Cascade Classifier dan Algoritma Adaboost untuk Deteksi Banyak Wajah dalam Ruang Kelas. Jurnal Teknologi IST AKPRIND Volume 6, Number 2 , 108-115.

Uktveris, T. (2012). opencv-lane-vehicle-track. https://code.google.com/p/opencv-lane-vehicle-track/.

Viola, Paul, & Jones, M. (2001). Rapid object detection using boosted cascade of simple features. In: Proceedings IEEE Conf. on Computer Vision and Pattern Recognition.