Основная проблема в вашем коде - это 5-й аргумент функции HoughCircles
.
Согласно документации список аргументов:
cv2.HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]]) → circles
Это означает, что 5-й аргумент применяется circles
(он дает возможность получить вывод по ссылке, вместо использования возвращаемого значения).
Поскольку вы не передаете аргумент circles
, вы должны передать именованные аргументы для всех аргументов после 4-го аргумента (например, param1=param1
, param2=param2
....).
Параметр проблемы с настройкой:
- Уменьшите значение
param1
. param1
- это более высокий порог, передаваемый Canny.
В вашем случае значение должно быть около 30
. - Уменьшите значение
param2
Документация не очень понятна, но установка значения около 50
работает. - Увеличение значения
maxRadius
- радиус 10
намного меньше радиуса ваших кругов.
Вот код:
import numpy as np
import cv2
img = cv2.imread('circles.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.medianBlur(gray, 25) #cv2.bilateralFilter(gray,10,50,50)
minDist = 100
param1 = 30 #500
param2 = 50 #200 #smaller value-> more false circles
minRadius = 5
maxRadius = 100 #10
# docstring of HoughCircles: HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]]) -> circles
circles = cv2.HoughCircles(blurred, cv2.HOUGH_GRADIENT, 1, minDist, param1=param1, param2=param2, minRadius=minRadius, maxRadius=maxRadius)
if circles is not None:
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
cv2.circle(img, (i[0], i[1]), i[2], (0, 255, 0), 2)
# Show result for testing:
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Результат: