Я работал над другим, связанным с вами вопросом, когда вы удалили его и увидели, что у вас проблемы с производительностью при поиске шара. Поскольку ваш шарик выглядит на приятном простом белом фоне (кроме партитуры и кнопки close
в правом верхнем углу), существуют более простые / быстрые способы поиска мяча.
Во-первых, работайте в оттенках серого, чтобы у вас был только 1 канал вместо 3 каналов RGB для обработки - это обычно быстрее.
Затем замените партитуру и меню в верхнем правом углу белыми пикселями, чтобы единственное, что осталось на изображении, это шар. Теперь инвертируйте изображение так, чтобы все белые стали черными, затем вы можете использовать findNonZero()
, чтобы найти все, что не является фоном, то есть шар.
Теперь найдите самую низкую и самую высокую координату в направлении y и усредните их для центра шара, аналогично в направлении x для другого пути.
#!/usr/bin/env python3
# Load image - work in greyscale as 1/3 as many pixels
im = cv2.imread('ball.png',cv2.IMREAD_GRAYSCALE)
# Overwrite "Current Best" with white - these numbers will vary depending on what you capture
im[134:400,447:714] = 255
# Overwrite menu and "Close" button at top-right with white - these numbers will vary depending on what you capture
im[3:107,1494:1726] = 255
# Negate image so whites become black
im=255-im
# Find anything not black, i.e. the ball
nz = cv2.findNonZero(im)
# Find top, bottom, left and right edge of ball
a = nz[:,0,0].min()
b = nz[:,0,0].max()
c = nz[:,0,1].min()
d = nz[:,0,1].max()
print('a:{}, b:{}, c:{}, d:{}'.format(a,b,c,d))
# Average top and bottom edges, left and right edges, to give centre
c0 = (a+b)/2
c1 = (c+d)/2
print('Ball centre: {},{}'.format(c0,c1))
Это дает:
a:442, b:688, c:1063, d:1304
Ball centre: 565.0,1183.5
что, если я нарисую красную рамку на шоу:
Обработка занимает 845 микросекунд на моем Mac или меньше миллисекунды, что соответствует 1183 кадрам в секунду. Очевидно, у вас есть время, чтобы схватить экран, но я не могу это контролировать.
Обратите внимание, что вы также можете изменить размер изображения, скажем, в 4 раза (или, может быть, 8 или 16) в каждом направлении и при этом быть уверенным в нахождении шара, что может сделать его еще быстрее.
Ключевые слова : мяч, трек, трекинг, локация, поиск, положение, изображение, обработка изображений, python, OpenCV, numpy, ограничивающий прямоугольник, bbox.