Я работаю над проектом, в котором пытаюсь обнаружить зеленые и красные круги на определенной поверхности (арене). Когда я пытаюсь сделать это с цифровой версией этой арены (изображение PNG), я могу успешно обнаружить оба цветных круга.
Вот цифровое изображение поверхности:
Теперь я распечатал эту арену на гибком диске (без этих двух цветных кругов) и вручную разместил на ней цветные круглые монеты. Но после захвата его изображения через веб-камеру с разрешением 1,3 МП определение цвета не сработало и дало ложные результаты.
Вот распечатанная арена, снятая веб-камерой:
Почему цвета не распознаются? Нужно ли выполнять постобработку изображения с веб-камеры? Я попытался повысить резкость изображения с помощью cv2.filter2D, но это тоже не сработало.
Вот фрагмент для обнаружения красных кругов из моего кода Python:
ip_image=cv2.imread("image.png")
kernel = np.array([[-1,-1,-1],[-1,9,-1],[-1,-1,-1]])
ip_image=cv2.filter2D(ip_image,-1,kernel)
#cv2.imshow("Hi",ip_image)
hsv=cv2.cvtColor(ip_image,cv2.COLOR_BGR2HSV)
red_low=np.array([0,255,255])
red_up=np.array([10,255,255])
mask0= cv2.inRange(hsv,red_low,red_up)
red_low=np.array([170,255,255])
red_up=np.array([180,255,255])
mask1=cv2.inRange(hsv,red_low,red_up)
mask_red=mask1+mask0
r_img= ip_image.copy()
r_img[np.where(mask_red==0)] = 0
gray_img0 = cv2.cvtColor(r_img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray_img0,0,255,0)
M = cv2.moments(thresh)
rX=int(M["m10"] / M["m00"])
rY=int(M["m01"] / M["m00"])
cv2.circle(ip_image,(rX,rY), 17, (255,255,255), 2)
cv2.imshow("Output",ip_image)
Кроме того, четвертый параметр в cv2.threshold() при установке на «0» правильно работает с цифровым изображением, а с изображением с веб-камеры выдает ошибку деления на ноль в строке:
rX=int(M["m10"]/M["m00"])