Хотя я понимаю, что для OpenCV HoughCircles
нет настройки "один размер подходит всем", у меня возникли некоторые проблемы с поиском хотя бы одного разумного набора параметров.
Мое входное изображение - это следующее фото, на котором есть несколько довольно заметных больших черных кругов, а также шум вокруг него:
Я попытался поиграть с аргументами p1
и p2
, чтобы попытаться точно определить четыре обнаруженных черных круга (и, необязательно, рулон ленты сверху - это не требуется, но я бы не стал возражать, если оно совпало или).
import numpy as np
import cv2
gray = frame = cv2.imread('testframe2.png')
gray = cv2.cvtColor(gray, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray,(5,5),0)
# gray = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 5, 2)
p1 = 200
p2 = 55
while True:
out = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 10, param1=p1, param2=p2, minRadius=10, maxRadius=0)
if circles is not None:
for (x, y, r) in circles[0]:
cv2.rectangle(out, (int(x - r), int(y - r)), (int(x + r), int(y + r)), (255, 0, 0))
cv2.putText(out, "r = %d" % int(r), (int(x + r), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 0.3, (255, 0, 0))
cv2.putText(out, "p: (%d, %d)" % (p1, p2), (0, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 4)
cv2.imshow('debug', out)
if cv2.waitKey(0) & 0xFF == ord('x'):
break
elif cv2.waitKey(0) & 0xFF == ord('q'):
p1 += 5
elif cv2.waitKey(0) & 0xFF == ord('a'):
p1 -= 5
elif cv2.waitKey(0) & 0xFF == ord('w'):
p2 += 5
elif cv2.waitKey(0) & 0xFF == ord('s'):
p2 -= 5
cv2.destroyAllWindows()
Кажется, лучшее, что я могу сделать, это обнаружить большой круг несколько раз, но совсем не маленький, или получить лот ложных срабатываний:
Я прочитал руководство F **, но оно не помогает мне дальше: как мне несколько надежнее обнаружить круги и ничего кроме кругов на этом изображении?