Langsung ke konten utama

Pendeteksian Lingkaran Menggunakan OpenCV dan C++

Pada kesempatan kali ini, saya ingin berbagi bagaimana caranya mendeteksi lingkaran dalam suatu citra menggunakan OpenCV dan C++. Dalam library OpenCV, kita sudah disediakan fungsi cvHoughCircles() untuk melakukan ini.

#include <iostream>
#include <cv.h>
#include <highgui.h>
#include <math.h>

using namespace std;
using namespace cv;

int main()
{
    IplImage* img = cvLoadImage("img.jpg", CV_LOAD_IMAGE_UNCHANGED);
    IplImage* gray = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
    CvMemStorage* storage = cvCreateMemStorage(0);

    cvCvtColor(img,gray, CV_BGR2GRAY);

    // This is done so as to prevent a lot of false circles from being detected
    cvSmooth(gray, gray, CV_GAUSSIAN, 7, 7);

    IplImage *canny = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
    IplImage *rgbcanny = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);
    
    //Lakukan edge detection menggunakan algoritma Canny
    cvCanny(gray, canny,50,100,3);

    //Lakukan pencarian lingkaran menggunakan algoritma Hough
    //Parameter
    //gray     : gambar grayscale dimana ingin dicari lingkaran-lingkarannya
    //storage  : memory storage tempat menyimpan hasil pencarian
    //CV_HOUGH_GRADIENT: metode pencarian lingkaran. Untuk saat ini baru ada metode ini di OpenCV
    //1        : Inverse ratio dari resolusi
    //70       : jarak piksel minimum antar lingkaran yang terdeteksi, semakin pendek bisa semakin banyak lingkaran yang terdeteksi (tergantung                    pada gambarnya)
    //250      : upper threshold untuk algoritma Canny
    //100       : threshold untuk deteksi titik pusat lingkaran
    //0        : Radius lingkaran minimum untuk dideteksi, jika tidak diketahui, beri nilai 0 saja
    //0        : Radius lingkaran maksimum untuk dideteksi, jika tidak diketahui, beri nilai 0 saja
    //==================================================================================================
    //Referensi: http://docs.adaptive-vision.com/4.1/studio/filters/FeatureDetection/cvHoughCircles.html
    //==================================================================================================
    CvSeq* circles = cvHoughCircles(gray, storage, CV_HOUGH_GRADIENT, 1, 70, 250, 100,0,0);

    //Konversi ke nilai RGB 
    cvCvtColor(canny, rgbcanny, CV_GRAY2BGR);

    //Untuk tiap lingkaran yang terdeteksi...
    for(size_t i=0;i<circles->total;i++) {
        //Ambil lingkaran ke-i yang terdeteksi. Hasilnya berupa suatu sekuens dengan urutan koordinat x dan y lingkaran, kemudian radius lingkaran
        float* p = (float*)cvGetSeqElem(circles,i);
        //Ambil koordinat x(p[0]) dan y(p[1])
        cv::Point center(cvRound(p[0]), cvRound(p[1]));
        int radius = cvRound(p[2]);

        // gambarkan pusat lingkaran 
         cvCircle(rgbcanny, center, 3, CV_RGB(0,255,0), -1, 8, 0 );

         // gambarkan lingkaran
         cvCircle(rgbcanny, center, radius+1, CV_RGB(0,0,255), 2, 8, 0 );

         //cetak  informasi ttg lingkaran (koordinat x dan y serta radius)
         printf("x: %d y: %d r: %d\n",center.x,center.y, radius);
    }

    cvNamedWindow("input", 1);
    cvShowImage("input", img);

    cvNamedWindow("circles", 1);
    cvShowImage("circles", rgbcanny);

    cvWaitKey(0);

    return 0;
}


Berikut ini hasilnya:

Hasil cvHoughCircles
Hasil cvHoughCircles

Sumber




Komentar

Postingan populer dari blog ini

PHP Tutorial - Menjalankan Program .exe "Hello World!" Melalui PHP

Hai semua, saya ingin berbagi ilmu yang saya dapatkan sambil mengerjakan skripsi saya. Pernah tidak, kalian sudah bikin suatu program keren menggunakan bahasa C/C++, tapi kalian harus menjalankannya di SERVER??? Contoh kasus yang membuat Anda melakukan ini apa? Contoh sederhananya membuat Web Service. Di mana operasi perhitungan service yang ditawarkan menggunakan bahasa C/C++. Kalau misal kalian mau bikin make PHP dari awal web servicenya, sebenarnya tidak apa-apa juga, tapi kalau misalkan sudah ada program C/C++-nya, mending make yang sudah ada daripada buat dari awal lagi kan??? :)

Android Tutorial - Membuat Rounded Corner Edit Text

Kali ini saya ingin menmposting tentang bagaimana caranya membuat rounded corner EditText (EditText dengan sudut membulat) di Android. Ikuti saja langkah-langkah berikut:

Android Tutorial - Menambahkan File Gambar ke Image Gallery Emulator Android

Kali ini saya ingin berbagi tentang bagaimana caranya kita bisa memasukkan file (baik itu gambar .jpg, .png, atau musik .mp4, .wav, dll.) tapi tanpa perlu diprogram menggunakan java, cukup lewat Eclipse atau ADTnya saja. Caranya cukup mudah ko.