Отслеживание белого шара на белом фоне (Python / OpenCV)

Я использую OpenCV в Python 3 для обнаружения белого / черного шара на белом поле и определения его точного (x, y, радиус) и цвета.

Я использую функции cv2.Canny () и cv2.findContours (), чтобы найти его, но проблема в том, что cv2.Canny () не всегда определяет полную форму круга (в большинстве случаев только 3/4 круга). Поэтому, когда я использую cv2.findContours (), он не определяет его как контур.

Пожалуйста, посмотри :

изображение 1и изображение 2

Это самый важный код:

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
edged = cv2.Canny(blurred, 10, 40) # 10 and 40 to be more perceptive
contours_canny= cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2]

После этого я использую: approx = cv2.approxPolyDP(contour,0.01*cv2.arcLength(contour,True),True)

Так что, если вы можете помочь мне найти решение, это было бы здорово! Может быть, есть функция, которая завершает форму круга, чтобы я мог его обнаружить?


person Aziz zeGeek    schedule 20.06.2017    source источник
comment
Вы пробовали круги Hough?   -  person alkasm    schedule 20.06.2017


Ответы (2)


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

Вот код Python, который использует трекбары, чтобы вы могли настроить цветовой порог:

cv2.namedWindow('temp')
cv2.createTrackbar('bl', 'temp', 0, 255, nothing)
cv2.createTrackbar('gl', 'temp', 0, 255, nothing)
cv2.createTrackbar('rl', 'temp', 0, 255, nothing)
cv2.createTrackbar('bh', 'temp', 255, 255, nothing)
cv2.createTrackbar('gh', 'temp', 255, 255, nothing)
cv2.createTrackbar('rh', 'temp', 255, 255, nothing)

bl_temp=cv2.getTrackbarPos('bl', 'temp')
gl_temp=cv2.getTrackbarPos('gl', 'temp')
rl_temp=cv2.getTrackbarPos('rl', 'temp')

bh_temp=cv2.getTrackbarPos('bh', 'temp')
gh_temp=cv2.getTrackbarPos('gh', 'temp')
rh_temp=cv2.getTrackbarPos('rh', 'temp')
thresh=cv2.inRange(frame,(bl_temp,gl_temp,rl_temp),(bh_temp,gh_temp,rh_temp))
person Saransh Kejriwal    schedule 20.06.2017
comment
Большое спасибо! Теперь все проще. - person Aziz zeGeek; 22.06.2017

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

person Totoro    schedule 20.06.2017