Sommario:

Tracciamento di oggetti Opencv: 3 passaggi
Tracciamento di oggetti Opencv: 3 passaggi

Video: Tracciamento di oggetti Opencv: 3 passaggi

Video: Tracciamento di oggetti Opencv: 3 passaggi
Video: Object tracking with Camshift – OpenCV 3.4 with python 3 Tutorial 30 2024, Novembre
Anonim
Tracciamento di oggetti Opencv
Tracciamento di oggetti Opencv

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()

Consigliato: