2016-11-09 7 views
2

Я реализую функцию, чтобы обнаружить круги в изображении. Я использую OpenCV для Java, чтобы идентифицировать круги. Изображения серой шкалы показывают круг.OpenCV HoughCircles не обнаруживает круги

Вот мой код:

Mat gray = new Mat(); 
Imgproc.cvtColor(img, gray, Imgproc.COLOR_BGR2GRAY); 
Imgproc.blur(gray, gray, new Size(3, 3)); 

Mat edges = new Mat(); 
int lowThreshold = 100; 
int ratio = 3; 
Imgproc.Canny(gray, edges, lowThreshold, lowThreshold * ratio); 

Mat circles = new Mat(); 
Vector<Mat> circlesList = new Vector<Mat>(); 

Imgproc.HoughCircles(edges, circles, Imgproc.CV_HOUGH_GRADIENT, 1, 60, 200, 20, 30, 0); 

Imshow grayIM = new Imshow("grayscale"); 
grayIM.showImage(edges); 

Любая идея, почему это может быть дело?

+0

Можете ли вы опубликовать исходное изображение и изображение, переданное в HoughCircle? Также, если возможно, промежуточные изображения. – barny

+0

Houghcircles следует использовать на изображении серого серого, а не на изображении края – Miki

ответ

0

Во-первых, поскольку Мики указал, что HughCircles следует применять непосредственно в шкале оттенков серого, он имеет собственный детектор Canny Edge.

Во-вторых, параметры HughCircles должны быть настроены на ваш тип изображений. Существует не одна настройка подходит для всех формул.

на основе кода этого работал для меня на некоторых сгенерированных кругах:

public static void main(String[] args) { 
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 
    Mat img = Highgui.imread("circle-in.jpg", Highgui.CV_LOAD_IMAGE_ANYCOLOR); 

    Mat gray = new Mat(); 
    Imgproc.cvtColor(img, gray, Imgproc.COLOR_BGR2GRAY); 
    Imgproc.blur(gray, gray, new Size(3, 3)); 

    Mat circles = new Mat(); 
    double minDist = 60; 
    // higher threshold of Canny Edge detector, lower threshold is twice smaller 
    double p1UpperThreshold = 200; 
    // the smaller it is, the more false circles may be detected 
    double p2AccumulatorThreshold = 20; 
    int minRadius = 30; 
    int maxRadius = 0; 
    // use gray image, not edge detected 
    Imgproc.HoughCircles(gray, circles, Imgproc.CV_HOUGH_GRADIENT, 1, minDist, p1UpperThreshold, p2AccumulatorThreshold, minRadius, maxRadius); 

    // draw the detected circles 
    Mat detected = img.clone(); 
    for (int x = 0; x < circles.cols(); x++) { 
     double[] c1xyr = circles.get(0, x); 
     Point xy = new Point(Math.round(c1xyr[0]), Math.round(c1xyr[1])); 
     int radius = (int) Math.round(c1xyr[2]); 
     Core.circle(detected, xy, radius, new Scalar(0, 0, 255), 3); 
    } 

    Highgui.imwrite("circle-out.jpg", detected); 
} 

входного изображения с кругами:

Input image with circles

Обнаруженные круги окрашены в красный цвет:

Detected circles are colored red

Примечание как на выходном изображении белый круг слева не был обнаружен очень близко к белому. Будет установлено значение p1UpperThreshold=20.

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

  • Нет связанных вопросов^_^