2013-11-14 3 views
2

Я использую opencv и java для поиска кругов на изображении, у меня есть изображение ниже. Я использую Хью, чтобы найти окружности с кодом, как это:Найти обработку изображений окружностей

Imgproc.medianBlur(result, result, 3); 
    Imgproc.medianBlur(result, result, 3); 
    Imgproc.medianBlur(result, result, 3); 
    Mat circles = new Mat(); 
    Imgproc.HoughCircles(result, circles, Imgproc.CV_HOUGH_GRADIENT, 1, 1, 200, 100, 30, 40); 
    System.out.println(circles.dump()); 

Но я получаю пустой коврик для результата с и без размытия. Как мне исправить этот код?

enter image description here

EDIT: Привет, ребята!

Благодаря вам у меня есть эта фотография сейчас. Я использую эти параметры:

Imgproc.HoughCircles(result, circles, Imgproc.CV_HOUGH_GRADIENT, 1, 20, 50, 10, 10, 40); 

Я до сих пор использую медианный блеск перед обнаружением.

Остается вопрос, почему он обнаруживает эти маленькие круги? Я приложил результат обнаружения canny, я думаю, что круги довольно заметны.

enter image description here enter image description here

ответ

2

Прежде всего, структура circles не должна быть cv::Mat, но должна быть std::vector<cv::Vec3f>; Я думаю, что именно поэтому вы не получаете никаких результатов .. Пожалуйста, обратитесь к документации по HoughCircles для деталей ..

Игра вокруг со значениями в течение 5 минут, у меня есть эта отправная точка для вас:

enter image description here

параметры, которые я использовал это,

cv::medianBlur(test_Circle, test_Circle, 7); 
std::vector<cv::Vec3f> circles; // <- not that "circles" is not cv::Mat 
cv::HoughCircles(test_Circle, circles, CV_HOUGH_GRADIENT, 1, 1, 300, 10, 10, 50); 

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

PS - Поскольку я являюсь пользователем C++, пожалуйста, извините меня за то, что вы разместили все мои структуры в этом формате. Вы можете легко расширить логику до Java. :)

+0

Мат может быть использован в качестве контейнера для вектора точек в OpenCV. Большинство функций, которые принимают вектор точек, будут принимать Mat и работать с ним. На самом деле, несколько версий OpenCV назад некоторые функции требовали от вектора каста к Mat. Но я согласен с тем, что использование Mat вместо вектора является чем-то запутанным. –

+0

Я использую Mat, потому что функция требует Mat в Java, и я получил только 3 значения в Mat, когда нашел только один круг. @MichaelBurdinov –

2

Вы уверены, что вы обеспечиваете радиус, а не диаметр? Попробуйте более широкий диапазон радиусов (например, 10-100).

Использование OpenCV для обмана в Zuma? :)

1

Я проверил мой код, он writtent в C# (я думаю, что Java является то же самое) и получить результат: 1

Вы можете найти свой код в классе HoughAlgorithm.cs Мой демонстрационный проект Here

//DP_Resolution: 1 
//MinDistance :32 
//CannyThreshold: 10 
//AccuThreshold: 10 
//MinRadius: 13 
//MaxRadius: 20 

public static CvSeq DetectCircles(IplImage pImage, CamEnum _camName) 
{ 
    try 
    { 
     CvMemStorage memStorage = cvlib.CvCreateMemStorage(0); 
     return cvlib.CvHoughCircles(ref pImage, memStorage.ptr, 3, 1, 32, 10, 10, 13, 20); 
    } 
    catch 
    { 
     throw; 
    } 
} 

http://i.stack.imgur.com/pUqbh.png

+0

У вас, похоже, много ложных срабатываний. –

+0

Мой английский нехорошо, ха-ха – JKing

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