Predittore di colpi utilizzando la regressione polinomiale
Questo progetto utilizzerà regressioni polinomiali per prevedere il tiro.
Questo progetto utilizzerà le librerie matematiche aperte CV, CVzone e Python per eseguire la previsione
Come funziona
- Useremo un cercatore di colori per tracciare l'oggetto in questo caso è una palla
- Per trovare il percorso usiamo i contatori e lo usiamo per trovare il valore della posizione e passarlo a una lista
- Usiamo la regressione polinomiale y= ax² +bx + c per la previsione da fare
- Installa e importa le dipendenze : "open CV" ci consentirà di importare la nostra immagine e il nostro video e quindi possiamo applicare loro la trasformazione, "CVzone" questo come libreria basata su un CV aperto ci consente anche di utilizzare la trasformazione comparativa con meno sintassi richiesta rispetto a CV aperto, "matematica" per eseguire la matematica è una libreria python e "numpy" per applicare semplici trasformazioni.
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)
Ora sappiamo quale oggetto tracciare, come possiamo seguirlo? useremo i contorni dell'immagine per tracciare quell'oggetto lo faremo usando la libreria 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. Regressione polinomiale — Useremo questo per trovare la curva più adatta per prevedere se la palla andrà nel canestro o meno l'equazione che useremo è y = ax²+bx+c
se troviamo i valori di a, b e c allora per ogni dato valore di x possiamo trovare y il valore di 'y' determinerà se la pallina sta entrando o meno come possiamo farlo? useremo il metodo numpy polyfit sulla lista delle posizioni che abbiamo creato in precedenza e il polyfit richiede due liste quindi dobbiamo cambiare un po' il nostro codice ora inizieremo due liste posListx e posListy e vi aggiungeremo i nostri contorni
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. Previsione: per prevedere se la palla andrà nel canestro o meno, abbiamo bisogno della larghezza e dell'altezza del canestro che sono rispettivamente x e y e sappiamo che l'altezza è costante, quindi dobbiamo trovare i valori x se la palla colpisce tra questi valore possiamo dire che la palla sta entrando ma non stiamo andando tutti i valori y ma solo l'altezza del bordo del canestro useremo paint per conoscere questi valori di x e y. Otteniamo i valori da x 330 a 430 e y 590
Ora dobbiamo trovare il valore di 'x' quando il valore di 'y' è 590 e se è compreso tra 330 e 430 allora è un paniere quindi, come possiamo farlo?
useremo questa equazione-
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
Grazie

![Che cos'è un elenco collegato, comunque? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































