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

Mengubah Repository Linux Menjadi Repository Lokal

Hlo teman-teman, pengen nge-share lagi nihh.. Baru-baru ini saya menginstall Deepin Linux, karena melihat UI cantiknya, dan saya juga mulai tertarik ke yang berbasis open source. Instalasi OS ini sangat mudah dan tidak make yang ribet-ribet. Hsilnya juga cantik kok.

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??? :)

Inkscape tutorial - Pembuatan Bola Biliar yang Tampak 3D

Salah satu dari aspek design yang sangat populer sekarang ini adalah pembuatan gambar 3D. Lebih dari satu teknik dapat digunakan untuk membuat gambar 3D. Bahkan gambar 2D bisa dibuat terlihat 3D. Di sini saya akan menunjukkan bagaimana membuat bola biliar tapi yang tampak tiga dimensi menggunakan Inkscape. Ini adalah materi yang saya pelajari dan kopas dari sini . Langkah-langkahnya adalah sebagai berikut: - Buat sebuah lingkaran dengan memilih circle tool. Agar lingkarannya tidak asal, buatlah sambil menekan Ctrl. - Hilangkan stroke-nya dengan klik kanan pada warna stroke di bagian bawah, kemudian pilih Remove Stroke. - Ganti warna lingkaran tersebut dengan warna dasar bola yang kalian inginkan. Di sini saya menggunakan warna coklat tua. - Pilih gradient tool (Ctrl+F1), dan pastikan kalian memilih tombol gradasi radialnya pada bagian atas jendela kalian setelah kalian memilih gradient tool. - Pastikan lingkaran bawah yang terpilih setelah kalian melakukan gr...