8

Próbuję wykryć kręgi za pomocą transformacji hough.Wykrywanie okręgu przy użyciu transformacji Hough

enter image description here

Z mojego obecnego kodu może wykryć ten poniżej

enter image description here

Ale chcę znaleźć czarną dziurę wewnątrz okręgu wykrytych ja. nie pomaga mi jednak zmiana parametrów metody korkowej. W rzeczywistości znalazł kręgi, które nie istnieją.

enter image description here

Również próbowałem przyciąć krąg ja znaleźć i zrobić kolejny Hough przekształcać w tej nowej części to też mi nie pomoże.

tutaj jest mój kod

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

Aktualizacja: od Hough wykorzystuje sprytny wewnątrz mam ręcznie wykorzystywane obrotny zobaczyć skop stwierdzi krąg, czy nie.

tutaj canny wyniki z Canny (src, src, 100, 200,3); enter image description here

dziękuję

+0

Spróbowałeś bez progu? HoughCircles używa canny wewnętrznie ... – Micka

+0

nie ma progu na obrazie. tylko rozmycie gaussowskie dla oświetlenia, ale je również wyłączyłem. –

+0

Czy możesz wysłać obrazek z dziurami, ale bez czarnych kółek, proszę. Nie widzę żadnych czarnych dziur na pierwszych dwóch obrazach. – kkuilla

Odpowiedz

1

Ty ustawienie jednego z parametrów HoughCirclesminDist = src.rows/8, co jest dość duża. docs wyjaśnić:

minDist - Minimalna odległość pomiędzy środkami wykrytych kręgach. Jeśli parametr jest zbyt mały, wiele okręgów sąsiednich może być fałszywie wykrywanych oprócz prawdziwego. Jeśli jest zbyt duży, niektóre kręgi mogą zostać pominięte.

Metoda nie może powrócić zarówno kółko, że ma znaleźć i krąg, który chcesz, ponieważ mają prawie ten sam środek (w granicach src.rows/8), po prostu różnych rozmiarach. Jeśli ustawisz maxRadius na wartość około 30 w celu wykluczenia większego koła, otrzymasz pożądany mniejszy okrąg?

+0

cześć, próbowałem HoughCircles (src, circles, CV_HOUGH_GRADIENT, 1, src.wiersze/16 (32,64), 200, 100, 0, 30); i żaden z okręgów faktycznie nie został znaleziony –

+0

Hmm, może "param2" jest zbyt duży. Warto wypróbować mniejsze wartości. Jeśli to nie zadziała, możesz wyświetlić wyjściowe 'krawędzie' z' Canny (src, edges, 100, 200) 'i upewnić się, że najpierw znajduje krawędź wewnętrznego koła. –

+0

cześć, pozwól mi zaktualizować moje pytanie z efektami. –