Этот проект будет использовать полиномиальную регрессию для прогнозирования выстрела.

Этот проект будет использовать открытые математические библиотеки CV, CVzone и python для выполнения прогноза.

Как это работает

  1. Мы будем использовать определитель цвета для отслеживания объекта, в данном случае это мяч.
  2. Чтобы найти путь, мы используем счетчики и используем его, находим значение позиции и передаем его в список.
  3. Мы используем полиномиальную регрессию y = ax² + bx + c для прогноза.

Процесс

  1. Установите и импортируйте зависимости — «open CV» позволит нам импортировать наше изображение и видео, а затем мы сможем применить к ним преобразование. «CVzone» — это библиотека, основанная на открытом CV, она также позволяет нам использовать сравнительное преобразование с меньшим количеством синтаксиса, чем open CV, «математика» для выполнения математики — это библиотека Python и «numpy» для применения простых преобразований.
import math
import cv2
import cvzone
from cvzone.ColorModule import ColorFinder
import numpy as np

2. Нахождение цвета объекта-

мы используем это вместо видео, нам нужно найти значение цвета, связанное с объектом, который мы собираемся отслеживать, для этого мы будем использовать пакет поиска цвета CVzone.

myColorFinder = ColorFinder(False)
hsvVals = {'hmin': 8, 'smin': 96, 'vmin': 115, 'hmax': 14, 'smax': 255, 'vmax': 255}

'True' - он находится в режиме отладки, поэтому он поможет нам найти цвет с помощью трекбаров. это будет две вещи imgColor и маска

imgColor, mask = myColorFinder.update(img, hsvVals)

2. Нахождение контуров

Теперь мы знаем, какой объект отслеживать, как мы можем его отслеживать? мы будем использовать контуры изображения для отслеживания этого объекта, мы сделаем это с помощью библиотеки CVzone

imgContours, contours = cvzone.findContours(img, mask, minArea=500)

в этом мы предоставим изображение, которое мы используем, и маску, которую мы получили от средства поиска цвета, и minArea для уменьшения шума, это вернет контуры. Теперь мы знаем цвет и положение объекта, для которого мы отображаем его положение кадр за кадром.

if contours:
  cx, cy = contours[0]['center']
  print(cx, cy) 
  cv2.circle(imgContours, (cx, cy), 5, (0, 255, 0), cv2.FILLED)

это даст контуры, но чтобы нарисовать их на всех кадрах, мы сохраним эти значения в списке, который даст связанную пунктирную линию пути мяча.

posList =[]

if contours:
  posList.append(contours[0]['center'])

for i, pos in enumerate(posList):
  cv2.circle(imgContours, pos, 5, (0, 255, 0), cv2.FILLED)
  if i == 0:
    cv2.line(imgContours, pos, pos, (0,255,0), 2)
  else:
    cv2.line(imgContours, pos, posList[i-1], (0,255,0), 2)

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

3. Полиномиальная регрессия — мы будем использовать это, чтобы найти наиболее подходящую кривую, чтобы предсказать, попадет ли мяч в корзину или нет. Уравнение, которое мы собираемся использовать: y = ax²+bx+c

если мы найдем значения a, b и c, то при любом заданном значении x мы сможем найти y, значение «y» будет определять, попадет мяч внутрь или нет, как мы можем это сделать? мы будем использовать метод numpy polyfit для списка позиций, который мы создали ранее, и для полифита требуется два списка, поэтому нам нужно немного изменить наш код, теперь мы инициируем два списка posListx и posListy и добавим в них наши контуры.

if contours:
  posListX.append(contours[0]['center'][0])
  posListY.append(contours[0]['center'][1])

if posListX:
# polynomial regression
# find the coefficients
  A, B, C = np.polyfit(posListX, posListY, 2)

  for i, (posX, posY) in enumerate(zip(posListX, posListY)):
    pos = (posX, posY)
    cv2.circle(imgContours, pos, 10, (0, 255, 0), cv2.FILLED)
    if i == 0:
      cv2.line(imgContours, pos, pos, (0, 255, 0), 5)
    else:
      cv2.line(imgContours, pos, (posListX[i - 1], posListY[i - 1]), (0, 255, 0), 2)

теперь у нас есть эти коэффициенты, мы поместим их в наше уравнение, каково значение «y» для каждого значения «x», значение x от (0, 1300) с изображения, и мы будем использовать фантазию для цикл, чтобы получить эти значения x и подогнать их под наше уравнение

xList = [item for item in range(0, 1300)]

for x in xList:
  y = int(A * x ** 2 + B * x + C)
  cv2.circle(imgContours, (x, y), 2, (255, 0, 255), cv2.FILLED)

это даст нам линию предсказания. Обратите внимание, что это квадратное уравнение, поэтому оно будет предсказывать только одну кривую, если мяч отскочит от нее, это не удастся, поэтому имейте это в виду.

4. Предсказание. Чтобы предсказать, попадет мяч в корзину или нет, нам нужны ширина и высота корзины, равные x и y соответственно, и мы знаем, что высота постоянна, поэтому мы должны найти x. значения, если мяч попадает между этими значениями, мы можем сказать, что мяч входит, но мы не собираемся использовать все значения y, а только высоту обода корзины, мы будем использовать краску, чтобы узнать эти значения x и y. Мы получаем значения x 330 до 430 и y 590

Теперь нам нужно найти значение «x», когда значение «y» равно 590, и если оно находится между 330 и 430, то это корзина, так как мы можем это сделать?

мы будем использовать это уравнение-

if len(posListX):
# prediction
# X values 330 to 430 Y 590
  a = A
  b = B
  c = C - 590
  
  x = int(-b - math.sqrt(b ** 2 - (4 * a * c))) / (2 * a)
  prediction = 330 < x < 430

чтобы показать, является ли это корзиной или нет, мы будем использовать CVzone putTextRect, и мы только предсказываем, когда это меньше десяти кадров, потому что после десяти кадров в основном мы достигаем корзины

if len(posListX) < 10:
# prediction
# X values 330 to 430 Y 590
  a = A
  b = B
  c = C - 590
  
  x = int(-b - math.sqrt(b ** 2 - (4 * a * c))) / (2 * a)
  prediction = 330 < x < 430

if prediction:
  cvzone.putTextRect(imgContours, "Basket", (50, 150),
                     scale=5, thickness=5, colorR=(0, 200, 0), offset=20)
else:
  cvzone.putTextRect(imgContours, "No Basket", (50, 150),
                     scale=5, thickness=5, colorR=(0, 0, 200), offset=20)

проверьте git для кода и ресурсов — https://github.com/Tejaswi-kashyap-006/computervision_projects

Спасибо