Mendeteksi Lingkaran Langsung dari Kamera dengan OpenCV Delphi

Pada tutorial mendeteksi lingkaran dengan OpenCV Delphi sebelumnya dilakukan dengan menganalisa file gambar yang dipilih setelah browse file explorer terlebih dahulu. Jadi tidak live dari kamera langsung. Nah pada tutorial kali ini akan coba kita tingkatkan kemampuan software kita supaya dapat langsung menganalisa tangkapan kamera (webcam), mendeteksi lingkaran kemudian menggambar outline lingkaran yang ditemukan. Teknik yang digunakan hampir sama dengan tutorial yang lalu, hanya saja kita akan mengambil gambar secara berkala dari kamera. Simak tutorialnya sbb:

Bikin project baru atau melanjutkan program sebelumnya. Tambahkan satu komponen Button, beri caption ‘cam circle’. Kemudian masukkan baris program sebagai berikut:

procedure TForm1.Button4Click(Sender: TObject);
begin
    capture := cvCreateCameraCapture(CV_CAP_ANY); // cvCaptureFromCAM( 0 );
    framebitmap := TBitmap.Create;
    framebitmap.PixelFormat := pf24bit;
    cvNamedWindow('Capture', CV_WINDOW_AUTOSIZE);
    frame := Nil;
    while true do
    begin
      frame := cvQueryFrame(capture);
      if not Assigned(gframe) then
      begin
        gframe := cvCreateImage(cvSize(frame^.width, frame^.height), IPL_DEPTH_8U, 1);
        storage := cvCreateMemStorage(0);
      end;
      cvCvtColor(frame, gframe, CV_BGR2GRAY);
      cvClearMemStorage(storage);
      results := cvHoughCircles (gframe,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(frame, pt, cvRound(p^[2]), CV_RGB(255, 0, 0),3);
    end;

    if Assigned(frame) then
      begin
      IplImage2Bitmap(frame, framebitmap);
      image1.Picture.Assign(framebitmap);
      end;
      cc := cvWaitKey(33);
      if (cc = 27) then
        Break    
    end; 
end;

Jangan lupa menambahkan Unit yang diperlukan

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  ocv.highgui_c,
  ocv.core_c,
  ocv.core.types_c,
  ocv.imgproc_c,
  ocv.imgproc.types_c,
  Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.ExtDlgs;

dan variabel-variabel yang dibutuhkan berikut tipe datanya

var
  Form1: TForm1;
  image: pIplImage = nil;
  src: pIplImage = nil;
  storage: pCvMemStorage;
  results: pCvSeq;
  i: Integer;
  p: pFloatArray;
  pt: TCvPoint;
  filename:PAnsiChar;
  capture       : pCvCapture    = nil;
  frame         : pIplImage     = nil;
  frame_grey    : pIplImage     = nil;
  framebitmap: TBitmap;
  width: Double;
  height: Double;
  gframe: PIplImage = nil;
  counter: Integer;
  filename1: pCVChar;
  cc: Integer;
  contours: pCvSeq = nil;
  h_next, c: pCvSeq;

definisikan tipe pFloatArray

type
  TFloatArray = array [0 .. 10] of Single;
   pFloatArray = ^TFloatArray;

Tipe datanya mungkin agak kurang familiar buat programmer native Delphi, tapi memang banyak tipe data baru yang disesuaikan dengan kebutuhan library OpenCV yang berbasis C/Python ini

Sudah selesai. Kini saatnya kita mencoba programnya dengan menekan tombol ‘Run’ atau F9. JIka mengikuti petunjuk di atas, maka seharusnya tampilan program akan seperti gambar di bawah

Belum sempurna sih, cuma sudah berhasil mendeteksi kandidat lingkaran dengan tepat

Kunci dari program di atas terletak pada baris 3 dan 13. Pada baris tersebut, capture gambar dari kamera (tipe data pCvCapture) kemudian akan dikonversi menjadi tipe data pIplImage yang dibutuhkan function cvHoughCircles pada baris 18. Proses selanjutnya sama dengan pencarian kandidat lingkaran sesuai parameter pada function ini. Untuk penjelasan masing-masing parameter function cvHoughCircles dapat Anda baca di tutorial mendeteksi lingkaran dengan OpenCV Delphi

Untuk function cvCreateCameraCapture(CV_CAP_ANY), parameter CV_CAP_ANY dapat Anda ganti dengan angka (integer) 0, 1, 2, dst sesuai dengan urutan kamera/webcam Anda

Trik kedua pada program di atas adalah bagaimana menampilkan hasil pemrosesan data gambar (yang sudah ditambakan outline pada lingkaran yang ditemukan) ke dalam komponen imagebox. Caranya adalah mengkonversi tipe data ‘pIplImage’ menjadi tipe data ‘Bitmap’ dengan procedure ‘IplImage2Bitmap’ (baris 28). Setelah menjadi bitmap tentunya akan sangat mudah bagi Anda untuk menampilkannya di komponen VCL ‘image’ (imagebox) sesuai baris 29.

Program di atas saya gunakan untuk mendeteksi lingkaran yang mengintepretasikan hole (lubang) pada pad PCB. Rencananya akan digunakan untuk mendeteksi hole PCB dan langsung dilakukan pengeboran (drilling) secara ototmatis.

Tags:

Leave a Reply