8

Sto provando a rilevare i cerchi con l'uso della trasformazione di Hough.Rilevamento del cerchio usando la trasformazione di Hough

enter image description here

Con il mio codice attuale posso rilevare quella qui sotto

enter image description here

Ma voglio trovare buco nero all'interno del cerchio che ho rilevato. tuttavia non è stato possibile modificare i parametri del metodo houghcircle. In realtà ha trovato cerchi che non esistono.

enter image description here

Inoltre ho provato raccolto il cerchio ho trovato e fare un altro trasformata di Hough su questa nuova parte anche non mi ha aiutato.

Ecco il mio codice

#include <stdio.h> 
#include <iostream> 
#include "opencv2/core/core.hpp" 
#include "opencv2/features2d/features2d.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/calib3d/calib3d.hpp" 
#include "opencv2/nonfree/nonfree.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/opencv.hpp" // needs imgproc, imgcodecs & highgui 
using namespace cv; 
using namespace std; 

int main(int argc, char** argv) 
{ 
    Mat src, circleroi; 

    /// Read the image 
    src = imread("/Users/Rodrane/Documents/XCODE/test/mkedenemeleri/alev/delikli/gainfull.jpg", 2); 


    /// Convert it to gray 
// cvtColor(src, src_gray, CV_BGR2GRAY); 
     /// Reduce the noise so we avoid false circle detection 
    GaussianBlur(src, src, Size(3, 3), 2, 2); 
    // adaptiveThreshold(src,src,255,CV_ADAPTIVE_THRESH_MEAN_C,CV_THRESH_BINARY,9,14); 
    vector<Vec3f> circles,circlessmall; 
// Canny(src, src, 50 , 70, 3); 
     /// Apply the Hough Transform to find the circles 
    HoughCircles(src, circles, CV_HOUGH_GRADIENT, 1, src.rows/8, 200, 100, 0, 0); 

    /// Draw the circles detected 
    for(size_t i = 0; i < circles.size(); i++) 
    { 
     Point center(cvRound(circles[i][0]), cvRound(circles[i][4])); 
     int radius = cvRound(circles[i][5]); 
     // circle center 
    circle(src, center, 3, Scalar(0,255,0), -1, 8, 0); 
     // circle outline 
     circle(src, center, radius, Scalar(0,255,0), 3, 8, 0); 

     circleroi = src(Rect(center.x - radius, // ROI x-offset, left coordinate 
             center.y - radius, // ROI y-offset, top coordinate 
             2*radius,   // ROI width 
             2*radius)); 



    //  imshow("Hough Circle Transform Demo", circleroi); 


} 

    resize(src, src, Size(src.cols/2, src.rows/2)); 
// threshold(circleroi, circleroi, 50, 255,CV_THRESH_BINARY); 

    // cout<<circleroi<<endl; 
    imshow("asd",src); 

    // imwrite("/Users/Rodrane/Documents/XCODE/test/mkedenemeleri/alev/cikti/deliksiz.jpg",circleroi); 


    waitKey(0); 
    return 0; 
} 

Aggiornamento: dal Hough utilizza astuto dentro mi sono abituato manualmente astuto per vedere montone castrato che trova il cerchio o meno.

qui canny risultati con Canny (src, src, 100, 200,3); enter image description here

ringraziamento

+0

Hai provato senza soglia? HoughCircles utilizza internamente astutamente ... – Micka

+0

non c'è alcuna soglia sull'immagine. solo sfocatura gaussiana per l'illuminazione ma l'ho disabilitata anche io. –

+0

Potresti postare l'immagine con i fori ma senza cerchi neri, per favore. Non riesco a vedere nessun buco nero nelle prime due immagini. – kkuilla

risposta

1

Stai impostando uno dei parametri HoughCirclesminDist = src.rows/8, che è abbastanza grande. Il docs spiegano:

MinDist - distanza minima tra i centri dei cerchi rilevati. Se il parametro è troppo piccolo, più cerchi vicini possono essere rilevati erroneamente oltre a quelli veri. Se è troppo grande, alcuni cerchi potrebbero non essere visualizzati.

Il metodo non può restituire sia il cerchio che lo fa trovare e il cerchio che si desidera, dal momento che hanno quasi lo stesso centro (entro src.rows/8), a dimensioni diverse. Se si imposta maxRadius su un valore di circa 30 per escludere il cerchio più grande, si ottiene il cerchio più piccolo desiderato?

+0

ciao, ho provato HoughCircles (src, cerchi, CV_HOUGH_GRADIENT, 1, src.righe/16 (32,64), 200, 100, 0, 30); e nessuna delle cerchie viene effettivamente trovata –

+0

Hmm, forse 'param2' è troppo grande. Vale la pena provare valori più piccoli lì. Se ciò non funziona, puoi mostrare l'output 'edges' di' Canny (src, edges, 100, 200) 'e assicurarti che stia trovando il bordo del cerchio interno in primo luogo. –

+0

ciao, lascia che aggiorni la mia domanda con i risultati astuti. –

Problemi correlati