2012-06-30 4 views
6

После обработки изображения путем преобразования его в оттенки серого, а затем размывание, я пытаюсь применить преобразование Hough Круг с этими параметрами:HoughCircles Параметры распознавать шары

  • CV_HOUGH_GRADIENT
  • дп = 1
  • Min_Dist = 1
  • param_1 = 70
  • param_2 = 100
  • min_radius = 0
  • max_radius = 0

Вот один из многих образов, которые я пробовал: http://i.stack.imgur.com/JGRiM.jpg

Но алгоритм не распознает мяч даже с расслабленными параметрами.

(Когда я пытаюсь его с изображением круга, созданного в GIMP он работает отлично)

ответ

0

Проверьте Канни выходе изображений в первую очередь. С этого выхода Canny можно обнаружить шар с очень маленьким param_2, а также множество ложных кругов на изображении. (Я использовал, например, param_2 = 10, и с указанным центром шара, чтобы исключить ложные кружки, которые он работает)

Постарайтесь помочь преобразованию окружности Hough Circle. Задача состоит в том, чтобы отделить мяч от других элементов. В вашей проблеме с изображением есть строка, вы можете попробовать сегментировать мяч, например, с помощью цветов.

+0

вы можете объяснить свою методику немного дальше? (Как сделать заданный центр шара). Если бы у меня был шар примерно в середине изображения, которое занимало от 60 до 70 процентов кадра. Как бы я мог определить наилучшие параметры? – jluzwick

+2

Вы можете обнаружить все круги с очень низким параметром_2. Это даст вам много ложных кругов. Тогда, если вы знаете центр примерно. Вы можете уничтожить. Просто перебирайте по всем кругам и удалите это расстояние до заданного аппроксимации центра больше некоторой дельта. – krzych

+0

Ах, умный! Да, это действительно очень полезно. – jluzwick

9

Я согласен с krzych. я имел его работать без особых усилий с:

cv::Mat img,img2; 
std::vector<cv::Vec3f> circles; 
img = cv::imread("JGRiM.jpg",1); 
cv::bilateralFilter(img, img2, 15, 1000, 1000); 
cv::cvtColor(img2, img2,CV_BGR2GRAY); 
cv::HoughCircles(img2, circles, CV_HOUGH_GRADIENT, 1,300,50, 10); 
cv::circle(img2,cv::Point(circles[0][0],circles[0][1]),circles[0][2],cv::Scalar(126),2); 
cv::imshow("test",img2); 

cv::waitKey(0); 
cv::imwrite("test.jpg",img2); 
return 0; 

enter image description here

Удачи :)

+0

Можете ли вы объяснить, как добраться до ваших номеров немного подробнее? Я пытаюсь сделать что-то подобное и хотел бы выяснить, как рассчитать лучшие числа, чтобы соответствовать моему решению. Благодаря! – jluzwick

+4

minDist = 300 (px), так что мы найдем только один круг (небольшое значение найдет несколько кругов вокруг шара). minRad = 10, поэтому мы избегаем подсчета небольших кругов (шума). по другим параметрам мне повезло: p (это изображение было очень надежным для изменений) –

+0

Спасибо! Это было очень полезно. Как насчет двустороннего фильтра? Я пытался найти хорошее объяснение параметров в большей части речи неспециалиста. Есть ли советы по этому поводу? – jluzwick

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