Mendeteksi Lingkaran dengan OpenCV dan Delphi 10

Melanjutkan tutorial sebelumnya yaitu mendeteksi lingkaran dengan OpenCV dan Python, kali ini saya akan coba memporting script dalam bahasa pemrograman Delphi, khususnya delphi 10.4 Sydney. Mengapa menggunakan Delphi? karena Delphi ini berbasis bahasa Pascal yang lebih mudah dipahami dan kesukaan saya sejak jaman kuliah 😊. Dan saat ini Delphi sudah support compatibility dengan Python dengan berbagai macam kompleksitasnya. Bagaimananapun juga Delphi dan Python adalah dua bahasa pemrograman yang berbeda strukturalnya, jadi tetap akan ada perbedaannya penanganannya, cara pemrogramannya dan trik-triknya supaya dapat membangun sebuah aplikasi. yang ‘robust’.

Baiklah, untuk membangun aplikasi berbasis OpenCV silahkan instal dulu komponennya. Caranya bisa Anda ikuti di artikel instal ‘komponen Delphi OpenCV‘. Untuk sintaksnya sangat mirip dengan sintaks python, jadi kalau Anda sudah mengenal Python, saya rasa tidak akan kesulitan memahami openCV versi Delphi ini. Mungkin yang agak membingungkan adalah tipe variabel Delphi tapi mengadopsi gaya pemrograman Python, karena tidak umum seperti yang biasa digunakan programmer. Ok, untuk hal tersebut kita belajar sambil jalan aja ya. Sedangkan untuk contoh program OpenCV-Delphi untuk mendeteksi lingkaran ada di bawah ini

Komponen Delphi yang Dibutuhkan

Bikin project Delphi baru, kemudian ambil dua buah komponen Button di tab ‘Standard’ di Component Pallete dan ubah properti caption menjadi ‘open’ dan ‘proses’

KomponenPropertiNilai
Button1captionopen
Button2captionproses

Ambil komponen OpenPictureDialog di tab ‘Dialogs’ Component Pallete, kemudian isikan baris program sbb event onClick milik komponen Button1 (untuk mudahnya bisa langsung double click komponen Button)

procedure TForm1.Button1Click(Sender: TObject);
begin
 if OpenPictureDialog1.Execute then
    if FileExists(OpenPictureDialog1.FileName) then    
      begin
      Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
      filename:= PAnsiChar(AnsiString(OpenPictureDialog1.FileName));
      showmessage(filename);     
      end
    else
      { Otherwise raise an exception. }
      raise Exception.Create('File tidak ditemukan');
end;

Double click komponen Button2 kemudian isikan baris program sbb:

procedure TForm1.Button2Click(Sender: TObject);
begin
image := cvLoadImage(filename, CV_LOAD_IMAGE_GRAYSCALE);
src := cvLoadImage(filename);    
    storage := cvCreateMemStorage(0);
    cvSmooth(image, image, CV_GAUSSIAN, 5, 5);   
    results := cvHoughCircles (image,storage,CV_HOUGH_GRADIENT,1,160,150,10,10,20);

    for i := 0 to results^.total - 1 do
    begin
      p := pFloatArray(cvGetSeqElem(results, i));
      pt := CvPoint(cvRound(p^[0]), cvRound(p^[1]));
      cvCircle(src, pt, cvRound(p^[2]), CV_RGB(255, 0, 0),2);
    end;
    cvNamedWindow('Deteksi Lingkaran', 1);
    cvShowImage('Deteksi Lingkaran', src);
    cvWaitKey(0);

    cvReleaseMemStorage(storage);
    cvReleaseImage(image);
    cvReleaseImage(src);
    cvDestroyAllWindows();
end;

Unit Delphi yang dibutuhkan

Tambahkan file Unit berikut agar bisa me-run program di atas. Definisikan di bawah klause ‘Uses’

ocv.highgui_c,
  ocv.core_c,
  ocv.core.types_c,
  ocv.imgproc_c,
  ocv.imgproc.types_c

Variabel Delphi yang dibutuhkan

Definisikan variabel-varibel yang dibutuhkan berikut ini di bawah klausa ‘var’

var
  Form1: TForm1;
  image: pIplImage = nil;
  src: pIplImage = nil;
  storage: pCvMemStorage;
  results: pCvSeq;
  i: Integer;
  p: pFloatArray;
  pt: TCvPoint;
  filename:PAnsiChar;

Beberapa tipe data baru yang disesuaikan dengan gaya Python yaitu : pCvMemStorage, pCvSeq, pFloatArray, TCvPoint

Catatan: Anda harus sudah menginstal komponen OpenCV agar dapat menggunakan Unit dan tipe data di atas

Hasil Program Delphi-OpenCV

Sudah selesai, kini tinggal kita coba saja hasilnya (tekan F9 untuk me-run program)

Klik tombol ‘open’ kemudian pilih file gambar yang akan dicari lingkarannya

Kemudian klik tombol ‘proses’, maka akan terbuka jendela baru dengan lingkaran yang sudah terdeteksi (ditandai dengan penggambaran lingkaran merah)

Pembahasan program

Dari sekian baris program barangkali baris ini yang perlu Anda cermati

results := cvHoughCircles (image,storage,CV_HOUGH_GRADIENT,1,160,150,10,10,20);

Script inilah yang digunakan untuk mendeteksi lingkaran dalam sebuah gambar. Untuk parameter yang digunakan function cvHoughCircles adalah sbb: (urut dari kiri ke kanan)

‘image’ : file gambar yang mau dideteksi lingkarannya
‘storage’ : tempat penyimpanan data (adopsi Python)
‘CV_HOUGH_GRADIENT’ : metode deteksi lingkaran OpenCV (saat ini baru metode ini yang tersedia)
‘1’ : akurasi deteksi lingkaran
‘160’ : jarak antar lingkaran yang dideteksi
‘150’ : semakin besar nilai ini lingkaran semakin mudah ditemukan
’10’ : tingkat kepresisian deteksi lingkaran
’10’ : minimum radius lingkaran
’20’ : maksimum radius lingkaran

Angka-angka di atas sifatnya experimental ya, jadi mungkin akan berbeda jika file gambar berbeda.

Bagi Anda yang membutuhkan program di atas bisa didownload di sini. Semoga bermanfaat

Tags:

Leave a Reply