Этот проект будет использовать полиномиальную регрессию для прогнозирования выстрела.
Этот проект будет использовать открытые математические библиотеки CV, CVzone и python для выполнения прогноза.
Как это работает
- Мы будем использовать определитель цвета для отслеживания объекта, в данном случае это мяч.
- Чтобы найти путь, мы используем счетчики и используем его, находим значение позиции и передаем его в список.
- Мы используем полиномиальную регрессию y = ax² + bx + c для прогноза.
Процесс
- Установите и импортируйте зависимости — «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
Спасибо