8

Ich versuche Kreise mit der Hough-Transformation zu erkennen.Kreis mit Hough-Transformation erkennen

enter image description here

Mit meinem aktuellen Code kann ich das unter

enter image description here

Aber ich will erkennen schwarzes Loch innerhalb des Kreises finden ich entdeckt habe. aber die Änderung der Parameter der Houghcircle-Methode ist mir nicht geholfen. Tatsächlich hat es Kreise gefunden, die nicht existieren.

enter image description here

Auch habe ich Ernte den Kreis versucht, die ich gefunden habe und das andere tun hough auf diesem neuen Teil auch nicht mir helfen, hat es zu transformieren.

hier ist mein Code

#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; 
} 

aktualisieren: seit hough verwendet Canny innerhalb ich manuell Canny verwendet werde, um zu sehen, ob es den Kreis oder nicht findet.

hier canny Ergebnisse mit Canny (src, src, 100, 200,3); enter image description here

danke

+0

Haben Sie es ohne Schwellenwert versucht? HoughCircles verwendet canny intern ... – Micka

+0

gibt es keine Schwelle auf Bild. nur Gaussian Blur für die Beleuchtung, aber ich habe es auch deaktiviert. –

+0

Könnten Sie bitte das Bild mit den Löchern posten, aber ohne die schwarzen Kreise. Ich kann in den ersten beiden Bildern keine schwarzen Löcher sehen. – kkuilla

Antwort

1

Sie sind eine der HoughCircles Parameter Einstellung minDist = src.rows/8, die ziemlich groß ist. Die docs erklären:

MinDist - Mindestabstand zwischen den Zentren der Kreise erfasst. Wenn der Parameter zu klein ist, können mehrere Nachbarkreise zusätzlich zu einem echten falsch erkannt werden. Wenn es zu groß ist, können einige Kreise übersehen werden.

Das Verfahren kann nicht sowohl den Kreis zurück, die finden, dass und den Kreis, die Sie wollen, da sie fast den gleichen Mittelpunkt haben (innerhalb src.rows/8), nur verschiedene Größen. Wenn Sie maxRadius auf einen Wert um 30 setzen, um den größeren Kreis auszuschließen, erhalten Sie den gewünschten kleineren Kreis?

+0

Hallo, ich habe versucht, HoughCircles (src, Kreise, CV_HOUGH_GRADIENT, 1, src.Reihen/16 (32, 64), 200, 100, 0, 30); und keiner der Kreise wird tatsächlich gefunden –

+0

Hmm, vielleicht 'Param2' ist zu groß. Es lohnt sich, dort kleinere Werte auszuprobieren. Wenn das nicht funktioniert, können Sie die Ausgabe 'Kanten' aus' Canny (src, Kanten, 100, 200) 'anzeigen und sicherstellen, dass die Kante des inneren Kreises an erster Stelle steht. –

+0

Hallo, lass mich meine Frage mit den schlauen Ergebnissen aktualisieren. –