8

Я пытаюсь обнаружить круги с использованием преобразования hough.Обнаружение круга с использованием преобразования Hough

enter image description here

С моим текущим кодом я могу обнаружить один ниже

enter image description here

Но я хочу, чтобы найти черную дыру внутри круга я обнаруженным. Однако изменение параметров метода houghcircle мне не помогло. На самом деле он нашел круги, которых не существует.

enter image description here

Также я пытался обрезать круг, я нашел и сделать еще один поджилки преобразования на этой новой части также не помогло мне.

вот мой код

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

Update: так поджилки используют осторожные внутри я вручную использовал осторожный, чтобы увидеть погоду он находит круг или нет.

здесь canny results with Canny (src, src, 100, 200,3); enter image description here

спасибо

+0

Пробовал ли вы это без порога? HoughCircles использует canny внутри ... – Micka

+0

на изображении нет порога. только гауссовское размытие для освещения, но я тоже отключил его. –

+0

Не могли бы вы разместить изображение с отверстиями, но без черных кругов, пожалуйста. Я не вижу черных дыр в первых двух изображениях. – kkuilla

ответ

1

Вы установки одного из параметров HoughCirclesminDist = src.rows/8, что является достаточно большим. docs объяснить:

minDist - Минимальное расстояние между центрами обнаруженных кругов. Если параметр слишком мал, несколько соседних окружностей могут быть ложно обнаружены в дополнение к истинному. Если он слишком велик, некоторые круги могут быть пропущены.

метод не может возвращать как круг, что он найдет и круг, который вы хотите, так как они имеют почти один и тот же центр (в пределах src.rows/8), просто разные размеры. Если вы установили maxRadius на значение около 30, чтобы исключить больший круг, вы получаете желаемый меньший круг?

+0

привет, я пробовал HoughCircles (src, круги, CV_HOUGH_GRADIENT, 1, src.строки/16 (32, 64), 200, 100, 0, 30); и ни один из кругов на самом деле не найден. –

+0

Хм, возможно, 'param2' слишком велик. Здесь стоит попробовать меньшие значения. Если это не сработает, вы можете отобразить выходные «ребра» из «Canny (src, edge, 100, 200)» и убедиться, что он находит край внутреннего круга в первую очередь. –

+0

привет, позвольте мне уточнить мой вопрос с хитрыми результатами. –

Смежные вопросы