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.
a Technopreneur – writer – Enthusiastic about learning AI, IoT, Robotics, Raspberry Pi, Arduino, ESP8266, Delphi, Python, Javascript, PHP, etc. Founder of startup Indomaker.com