Sommario:
- Passaggio 1: disegnare un rettangolo sull'oggetto riconosciuto
- Passaggio 2: traccia il percorso in cui si è spostato l'oggetto
- Passaggio 3: integrazione di entrambi i codici
Video: Tracciamento di oggetti Opencv: 3 passaggi
2025 Autore: John Day | [email protected]. Ultima modifica: 2025-01-10 13:47
Il rilevamento di oggetti in movimento è una tecnica utilizzata nella visione artificiale e nell'elaborazione delle immagini. Più fotogrammi consecutivi di un video vengono confrontati con vari metodi per determinare se viene rilevato un oggetto in movimento.
Il rilevamento di oggetti in movimento è stato utilizzato per un'ampia gamma di applicazioni come la videosorveglianza, il riconoscimento di attività, il monitoraggio delle condizioni stradali, la sicurezza degli aeroporti, il monitoraggio della protezione lungo il confine marittimo e così via.
Il rilevamento di oggetti in movimento consiste nel riconoscere il movimento fisico di un oggetto in un determinato luogo o regione.[2] Agendo sulla segmentazione tra gli oggetti in movimento e l'area o regione stazionaria, il movimento degli oggetti in movimento potrebbe essere tracciato e quindi analizzato in seguito. Per ottenere ciò, considera che un video è una struttura costruita su singoli fotogrammi, il rilevamento di oggetti in movimento consiste nel trovare i bersagli in movimento in primo piano, in ogni fotogramma video o solo quando il bersaglio in movimento mostra la prima apparizione nel video.
Userò la combinazione Opnecv e Python per rilevare e tracciare gli oggetti in base al colore
Passaggio 1: disegnare un rettangolo sull'oggetto riconosciuto
se il tuo pc non ha python o opencv, segui le istruzioni di seguito
ecco il codice Python:
import cv2import numpy as np
cap = cv2. VideoCapture(0)
mentre vero:
_, cornice = cap.read() hsv = cv2.cvtColor(frame, cv2. COLOR_BGR2HSV)
inferiore_giallo = np.array([20, 110, 110])
giallo_superiore = np.array([40, 255, 255])
yellow_mask = cv2.inRange(hsv, lower_yellow, upper_yellow)
(_, contorni, _) = cv2.findContours(yellow_mask, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)
per contorno in contorni:
area = cv2.contourArea(contour)
if(area > 800):
x, y, w, h = cv2.boundingRect(contour) frame = cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 10)
cv2.imshow("inseguimento", cornice)
k = cv2.waitKey(5) & 0XFF
se k == 27: break
cv2.destroyAllWindows()
cap.release()
Passaggio 2: traccia il percorso in cui si è spostato l'oggetto
per tracciare il percorso:
for i in range(1, len(center_points)): b = random.randint(230, 255) g = random.randint(100, 255) r = random.randint(100, 255) if math.sqrt(((center_points[i - 1][0] - center_points[0]) ** 2) + ((center_points[i - 1][1] - center_points[1]) ** 2)) <= 50: cv2.line(frame, center_points[i - 1], center_points, (b, g, r), 4)
Passaggio 3: integrazione di entrambi i codici
ho intenzione di integrare sia il codice
import cv2import numpy as np import random from collection import deque
cap = cv2. VideoCapture(1)
# Per tenere traccia di tutti i punti in cui l'oggetto ha visitato center_points = deque()
mentre vero:
# Leggi e capovolgi frame _, frame = cap.read() frame = cv2.flip(frame, 1)
# Sfoca un po' la cornice
blur_frame = cv2. GaussianBlur(frame, (7, 7), 0)
# Converti da BGR a formato colore HSV
hsv = cv2.cvtColor(blur_frame, cv2. COLOR_BGR2HSV)
# Definisce l'intervallo inferiore e superiore del colore hsv da rilevare. Blu qui
lower_blue = np.array([100, 50, 50]) upper_blue = np.array([140, 255, 255]) mask = cv2.inRange(hsv, lower_blue, upper_blue)
# Crea un kernel ellittico
kernel = cv2.getStructuringElement(cv2. MORPH_ELLIPSE, (15, 15))
# Apertura morph (erosione seguita da dilatazione)
mask = cv2.morphologyEx(mask, cv2. MORPH_OPEN, kernel)
# Trova tutti i contorni
contorni, gerarchia = cv2.findContours(mask.copy(), cv2. RETR_LIST, cv2. CHAIN_APPROX_SIMPLE)[-2:]
se len(contorni) > 0:
# Trova il contorno più grande large_contour = max(contours, key=cv2.contourArea)
# Trova il centro del contorno e disegna un cerchio pieno
momenti = cv2.moments(biggest_contour) center_of_contour = (int(moments['m10'] / momenti['m00']), int(moments['m01'] / momenti['m00'])) cv2.circle(frame, center_of_contour, 5, (0, 0, 255), -1)
# Delimita il contorno con un cerchio
ellisse = cv2.fitEllipse(biggest_contour) cv2.ellipse(frame, ellisse, (0, 255, 255), 2)
# Salva il centro del contorno in modo da tracciare una linea seguendolo
center_points.appendleft(center_of_contour)
# Traccia una linea dai punti centrali del contorno
for i in range(1, len(center_points)): b = random.randint(230, 255) g = random.randint(100, 255) r = random.randint(100, 255) if math.sqrt(((center_points[i - 1][0] - center_points[0]) ** 2) + ((center_points[i - 1][1] - center_points[1]) ** 2)) <= 50: cv2.line(frame, center_points[i - 1], center_points, (b, g, r), 4)
cv2.imshow('originale', cornice)
cv2.imshow('maschera', maschera)
k = cv2.waitKey(5) & 0xFF
se k == 27: break
cv2.destroyAllWindows()
cap.release()