Introduzione al tracciamento degli oggetti utilizzando OpenCV

Contenuti

Questo articolo è stato pubblicato nell'ambito del Blogathon sulla scienza dei dati

introduzione

OpenCV è un ottimo strumento per giocare con immagini e video. Oppure vuoi dare alle tue foto un aspetto in bianco e nero del 90 o eseguire complesse operazioni matematiche, OpenCV è sempre pronto a servire. Se ti piace la visione artificiale, la conoscenza di OpenCV è essenziale. La libreria include più di 2500 algoritmi ottimizzati che possono essere utilizzati per eseguire un'ampia varietà di attività. È utilizzato da molti giganti del settore come Google, Microsoft, IBM ed è ampiamente utilizzato nei gruppi di ricerca. La libreria supporta più lingue, compreso java, C ++ e pitone.

Questo articolo ti mostrerà come eseguire il complesso compito del tracciamento degli oggetti utilizzando alcune delle funzioni di base di OpenCV.

Puoi considerare un esempio di una partita di calcio. Hai una trasmissione in diretta della partita e il tuo compito è monitorare la posizione della palla in ogni momento. Il compito sembra semplice per un umano medio, ma è troppo complesso anche per la macchina più intelligente. Come saprai?, i computer capiscono solo i numeri. Non capisci cos'è un'immagine, ma i valori dei pixel associati all'immagine. Due immagini che sembrano esattamente identiche all'occhio umano potrebbero non essere lo stesso caso per il tuo computer, poiché anche un piccolo cambiamento in un pixel risulterà in una differenza. Perché, il tracciamento degli oggetti è considerato uno dei compiti più complessi nella visione artificiale. Sebbene complesso, non è qualcosa di irraggiungibile.

Il tracciamento degli oggetti può essere eseguito utilizzando l'apprendimento automatico e gli approcci basati sull'apprendimento profondo. L'approccio del deep learning da un lato fornisce risultati migliori in compiti complessi ed è abbastanza diffuso, richiede molti dati di allenamento. Sebbene gli approcci basati su ML siano abbastanza semplici ma non diffusi. Per questo articolo, stiamo utilizzando un approccio basato su ML in combinazione con varie tecniche di visione artificiale di cui parleremo più avanti in questo articolo.

La tecnica è ampiamente utilizzata nella sorveglianza, sicurezza, monitoraggio del traffico, visione robotica, videocomunicazione e molto altro. Cosa c'è di più, il tracciamento degli oggetti ha più casi d'uso, mentre la folla conta, veicoli autonomi, riconoscimento facciale, eccetera. Ti vengono in mente altri esempi in cui puoi utilizzare il tracciamento degli oggetti nella tua vita quotidiana??

A causa di così tante applicazioni nella vita reale, in questo campo si sta facendo una ricerca costante per ottenere una maggiore precisione e rendere il modello più robusto.

Per questo articolo, useremo questo video. Come vedrai, c'è una palla rossa che si muove attraverso un labirinto e il nostro compito è rilevare la posizione della palla e trovare il suo baricentro. Ho anche potuto vedere un grande rumore (scusate gente), sfondo, per rendere i compiti un po' più impegnativi.

22521screenshot2025-6154785

1.

Primo, importiamo le librerie necessarie da utilizzare.

import numpy as np
import cv2

2.

Definiremo una funzione che ridimensionerà le immagini per adattarle al nostro schermo nel caso siano abbastanza grandi. Questo passaggio è completamente facoltativo e puoi saltarlo.

def ridimensiona(img):
        return cv2.resize(img,(512,512)) # arg1- immagine in ingresso, argomento- larghezza_uscita, output_height

3.

Come saprai?, i video sono fatti di frame. Le cornici sono solo una delle tante immagini fisse che insieme compongono l'intera immagine in movimento. Il prossimo passo sarà leggere quei fotogrammi usando la funzione VideoCapture () in OpenCV e utilizzando il ciclo while, possiamo vedere i dipinti in movimento. È possibile regolare la velocità del video utilizzando cv2.waitKey (X) che mette in pausa lo schermo per x millisecondi.

cap=cv2. VideoCapture(vid_file_path)
Giusto,frame=cap.read()

while ret==True:
    Giusto,frame=cap.read()
    cv2.imshow("portafoto",ridimensionare(portafoto))
    key=cv2.waitKey(1)
    if key==ord('Q'):
        break
cv2.waitKey(0)
cv2.destroyAllWindows()

4.

OpenCV legge le immagini in formato BGR, quindi convertiremo lo spazio colore da BGR a HSV. Perché HSV e non BGR o qualsiasi altro formato?

Stiamo usando il formato colore HSV perché è più sensibile a piccoli cambiamenti nell'illuminazione esterna.. Perciò, darà maschere più accurate e, così, risultati migliori.

Dopo aver convertito lo spazio colore, quello che dobbiamo fare è filtrare il canale rosso e creare una cornice maschera.

Il canale rosso in formato hsv è presente in [0,230,170] per [255,255,220] distanza.

cap=cv2. VideoCapture(vid_file_path)


Giusto,frame=cap.read()
l_b=np.array([0,230,170])# lower hsv bound for red
u_b=np.array([255,255,220])# upper hsv bound to red

while ret==True:
    Giusto,frame=cap.read()

    hsv=cv2.cvtColor(portafoto,cv2. COLOR_BGR2HSV)
    mask=cv2.inRange(hsv,l_b,u_b)

    cv2.imshow("portafoto",ridimensionare(portafoto))

    cv2.imshow("maschera",maschera)


    key=cv2.waitKey(1)
    if key==ord('Q'):
        break
cv2.waitKey(0)
cv2.destroyAllWindows()

68572mascherato-4189669

(Questa immagine è stata ridimensionata)

5.

Fino ad ora, abbiamo creato l'immagine mascherata del fotogramma e filtrato la maggior parte del rumore. Quello che segue è ottenere i limiti della palla. Per questo useremo il concetto di rilevamento del contorno. I contorni non sono altro che limiti che circonderanno la nostra palla. fortunatamente, non dobbiamo trovare quei limiti da soli, poiché OpenCV consente una funzione findContours () che possiamo usare per il nostro scopo. Prende un'immagine mascherata e restituisce una serie di contorni. Per maggiori informazioni sui contorni, visitare me. Idealmente, nel nostro caso, il valore dei contorni dovrebbe essere uno, visto che abbiamo solo una palla, ma perché alcune persone indossavano cappelli rossi, ne prenderemo più di uno. Riesci a pensare a qualcosa per ridurre ulteriormente questo rumore??

Per gestire questo problema useremo un'altra funzione OpenCV che è cv2.contourArea (). Lo sappiamo nella foto mascherata, la palla ha l'area più grande e così anche il suo contorno. Perciò, otterremo il contorno con l'area maggiore.

Abbiamo i contorni della palla e possiamo disegnare direttamente questi contorni usando la funzione cv2.drawContours (). Ma per le attività di rilevamento, quello che facciamo di solito è usare un rettangolo ben delimitato per mostrare che l'oggetto è stato rilevato. Per farlo, useremo la funzione cv2.boundingRect (). Questa funzione restituirà le coordinate del rettangolo e quindi la funzione cv2.rectangle () disegnerà il rettangolo per noi.

cap=cv2. VideoCapture(vid_file_path)


Giusto,frame=cap.read()
l_b=np.array([0,230,170])# lower hsv bound for red
u_b=np.array([255,255,220])# upper hsv bound to red

while ret==True:
    Giusto,frame=cap.read()

    hsv=cv2.cvtColor(portafoto,cv2. COLOR_BGR2HSV)
    mask=cv2.inRange(hsv,l_b,u_b)

    contorni,_= cv2.findContours(maschera,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

    max_contour = contorni[0]
         per contorno nei contorni:
                if cv2.contourArea(contorno)>cv2.contourArea(max_contour):

                      max_contour=contour

         contour=max_contour
         approx=cv2.approxPolyDP(contorno, 0.01*cv2.arcLunghezza(contorno,Vero),Vero)
         X,e,w,h=cv2.boundingRect(Circa.)
         cv2.rettangolo(portafoto,(X,e),(x+w,y+h),(0,255,0),4)

    cv2.imshow("portafoto",ridimensionare(portafoto))

    cv2.imshow("maschera",maschera)

528745-3351114

(Questa immagine è stata ridimensionata)

6.

Cosa c'è di più, quello che possiamo fare è rilevare il centroide della palla contemporaneamente. Per quello, useremo cv2.moments. cv2.moments calcola la somma media ponderata delle intensità dei pixel all'interno del contorno e, così, consente di ottenere informazioni più utili dal BLOB, come la tua radio, centroide, eccetera. Assicurarsi di convertire l'immagine in formato binario prima di utilizzare il comando. Puoi saperne di più sui momenti qui.

cap=cv2. VideoCapture(vid_file_path)


Giusto,frame=cap.read()
l_b=np.array([0,230,170])# lower hsv bound for red
u_b=np.array([255,255,220])# upper hsv bound to red

while ret==True:
    Giusto,frame=cap.read()

    hsv=cv2.cvtColor(portafoto,cv2. COLOR_BGR2HSV)
    mask=cv2.inRange(hsv,l_b,u_b)

    contorni,_= cv2.findContours(maschera,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

    max_contour = contorni[0]
         per contorno nei contorni:


                if cv2.contourArea(contorno)>cv2.contourArea(max_contour):

                  max_contour = contour

         approx=cv2.approxPolyDP(contorno, 0.01*cv2.arcLunghezza(contorno,Vero),Vero)
         X,e,w,h=cv2.boundingRect(Circa.)
         cv2.rettangolo(portafoto,(X,e),(x+w,y+h),(0,255,0),4)

         M=cv2.moments(contorno)

cx = int (m['m10']//METRO['m00'])
cy = int (m['m01']//METRO['m00'])
cv2.circle (marco, (cx, cy), 3, (255,0,0), – 1)


    cv2.imshow("portafoto",ridimensionare(portafoto))

    cv2.imshow("maschera",maschera)

    key=cv2.waitKey(1)
    if key==ord('Q'):
        break
cv2.waitKey(0)
cv2.destroyAllWindows()

200486-8346694

(Questa immagine è stata ridimensionata)

Dove andare da qui?

In questo articolo, Abbiamo utilizzato il rilevamento degli oggetti in ogni fotogramma per l'attività di tracciamento degli oggetti. Anche se è utile, potrebbe non funzionare bene in tutti i casi. Durante la lettura dell'articolo, diverse domande potrebbero aver colpito il tuo cervello. Cosa succede se c'è più di un oggetto nel video? Cosa succede se le immagini della maschera non aiutano a rilevare l'oggetto?? Cosa succede se l'oggetto si muove costantemente dentro e fuori dall'inquadratura?? E se non ci fosse alcun oggetto??

L'unico modo per trovarli è provarli da soli.. Puoi sempre modificare gli input e rendere il compito un po' più impegnativo fino a quando il divertimento non si ferma.

Il supporto mostrato in questo articolo non è di proprietà di DataPeaker e viene utilizzato a discrezione dell'autore.

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.