Prédicteur de tir utilisant la régression polynomiale
Ce projet utilisera des régressions polynomiales pour prédire le tir.
Ce projet utilisera des bibliothèques mathématiques ouvertes CV, CVzone et python pour effectuer la prédiction
Comment ça fonctionne
- Nous utiliserons un détecteur de couleur pour suivre l'objet dans ce cas c'est une balle
- Pour trouver le chemin, nous utilisons des compteurs et l'utilisons pour trouver la valeur de position et la transmettre à une liste
- Nous utilisons la régression polynomiale y= ax² +bx + c pour la prédiction à faire
- Installez et importez les dépendances - "CV ouvert" nous permettra d'importer notre image et notre vidéo, puis nous pourrons leur appliquer la transformation, "CVzone" ceci en tant que bibliothèque basée sur un CV ouvert, il nous permet également d'utiliser la transformation comparative avec moins syntaxe requise que CV ouvert, "maths" pour effectuer des mathématiques c'est une bibliothèque python et "numpy" pour appliquer des transformations simples.
import math
import cv2
import cvzone
from cvzone.ColorModule import ColorFinder
import numpy as np
myColorFinder = ColorFinder(False)
hsvVals = {'hmin': 8, 'smin': 96, 'vmin': 115, 'hmax': 14, 'smax': 255, 'vmax': 255}
imgColor, mask = myColorFinder.update(img, hsvVals)
Maintenant que nous savons quel objet suivre, comment pouvons-nous le suivre ? nous utiliserons les contours de l'image pour suivre cet objet nous le ferons en utilisant la bibliothèque CVzone
imgContours, contours = cvzone.findContours(img, mask, minArea=500)
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. Régression polynomiale - Nous l'utiliserons pour trouver la courbe la mieux adaptée pour prédire si la balle va dans le panier ou non l'équation que nous allons utiliser est y = ax²+bx+c
si nous trouvons les valeurs de a, b et c, alors à n'importe quelle valeur donnée de x, nous pouvons trouver le y, la valeur de 'y' déterminera si la balle entre ou non, comment pouvons-nous faire cela ? nous allons utiliser la méthode numpy polyfit sur la liste de positions que nous avons créée précédemment et le polyfit nécessite deux listes, nous devons donc modifier un peu notre code maintenant nous allons lancer deux listes posListx et posListy et y ajouter nos contours
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)
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. Prédiction - Pour prédire si la balle va dans le panier ou non, nous avons besoin de la largeur et de la hauteur du panier qui sont respectivement x et y et nous savons que la hauteur est constante, nous devons donc trouver les valeurs x si la balle frappe entre celles-ci valeur nous pouvons dire que la balle entre mais nous n'allons pas toutes les valeurs y mais seulement la hauteur du rebord du panier nous utiliserons de la peinture pour connaître ces valeurs de x et y. On obtient les valeurs de x 330 à 430 et y 590
Maintenant, nous devons trouver la valeur de 'x' lorsque la valeur de 'y' est de 590 et si elle se situe entre 330 et 430, alors c'est un panier, alors comment pouvons-nous faire cela ?
nous utiliserons cette équation-
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
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)
Results
Merci
![Qu'est-ce qu'une liste liée, de toute façon? [Partie 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































