Face Recognition and Tracking con OpenCV (prima parte)
Face Recognition and Tracking con OpenCV
Nella prossima serie di articoli cercherò di spiegare come utilizzare OpenCV per effettuare il riconoscimento di oggetti. Proverò pian piano a spiegare, attraverso semplici passi come ottenere risultati interessanti in breve tempo. Voglio precisare che l’oggetto dell’articolo/tutorial, non è casuale, ma il tema del face recognition e tracking fa parte di uno studio effettuato su diverse tecnologie in ambito AI in seno ad un progetto di ricerca, Alex (Auto Learning Experiment), che stiamo portando avanti in Eclettica da un pò di tempo con l’obiettivo di verificare la possibilità di simulare un’iterazione uomo macchina di tipo umano.
Perchè iniziare, dunque, con OpenCV?
ritengo che sia un framework semplice da usare ed una buona base di partenza per chi ha la necessità di sviluppare qualche applicazione in cui sono necessarie funzionalità di elaborazione immagini.
Prima, però, di partire a razzo con l’esempio sul face recognition, ritengo sia necessario fare un passaggio preliminare sulle caratteristiche generali del framework e sulle sue strutture di base, se non altro per avere una visione più chiara di quello che vedremo in seguito.
OpenCV è una libreria open source specializzata nel trattamento di immagini e nell’apprendimento automatico; è stato rilasciato sotto licenza BSD ed è, quindi, gratuito sia per uso accademico e sia per uso commerciale. Le interfacce di sviluppo sono diverse : C ++, C, Python e Java e gira sia sotto Windows, Linux, Mac OS, iOS e Android; nel nostro esempio utilizzeremo python come interfaccia di programmazione.
OpenCv è strutturato essenzialmente in 4 moduli principali: CXCORE, CV, ML, HightGUI, sebbene esistano altre interfacce per semplificare lo sviluppo tra cui ad esempio quella per accedere alle webcam.
In sintesi OpenCV è un framework così costruito:
- CXCORE: implementa le strutture dati e le funzioni per gestire immagini e video.
- CV: modulo specializzato nell’elaborazione e l’analisi delle immagini, la calibrazione e il tracking.
- ML (Machine Learning): contiene molte funzioni sul Machine Learning e sul pattern recognition, quali il clustering e la classificazione
- HighGUI: implementa le definizioni delle interfacce utente (GUI).
Ai fini del nostro esempio analizzeremo essenzialmente i moduli CXCORE, CV e HightGUI, ma utilizzeremo anche le interfacce per l’acquisizione dei flussi video via webcam; darò per scontato che il sistema sia pronto per l’uso di python ( nel nostro caso versione 3.6 ) e opencv.
Solo per completezza ricordo che si può installare in ambiente linux la versione precompilata di openCV per python eseguendo semplicemente:
$ yum install numpy opencv*
oppure per Ubuntu o Debian
sudo apt-get install libopencv-dev python-opencv pip install numpy
dove numpy è una libreria matematica molto potente ed è un prerequisito per l’installazione di opencv.
Per verificare la corretta installazione di opencv basta usare una python console e scrivere le seguenti righe di codice:
>>> import cv2 >>> print (cv2.__version__)
Bene! iniziamo ad esaminare i primi metodi che abbiamo a disposizione per la gestione delle immagini ed a riguardo cerchiamo di capire come sia possibile caricare e modificare una singola immagine.
Per leggere, dunque, un’immagine da file basta invocare il metodo cv2.imread(arg1,arg2) che ammette due argomenti:
- arg1 : è il path dell’immagine da caricare
- arg2 : è un flag che può assumere valore 1,0 e -1
- cv2.IMREAD_COLOR : il valore è settato a 1 per imagini a colori.
- cv2.IMREAD_GRAYSCALE : il valore è settato a 0 per immagini a scala di grigio.
- cv2.IMREAD_UNCHANGED :il valore è settato a -1 per immagini che prevedono trasparenze.
proviamo a scrivere le seguenti righe di codice:
import cv2 img = cv2.imread('esempio1.jpg',1)
come si può vedere python semplifica moltissimo la scrittura del codice infatti nelle 2 righe precedenti è stato importato opencv ed è stato assegnato all’oggetto img il valore dell’immagine salvata nel file system e che ovviamente sarà disponibile per i nostri scopi. Proviamo a visualizzarla in una finestra; è sufficiente, in tal caso, aggiungere al codice precedente la seguente riga:
cv2.imshow('Image',img)
per una migliore gestione dell’esempio è utile inserire anche una sequenza di attesa prima di distruggere la finestra ed uscire dal software; inseriamo pertanto le due seguenti righe che servono per gestire l’uscita dal software a valle della pressione di un tasto:
cv2.waitKey(0) cv2.destroyAllWindows()
cv2.waitKey() Se si passa il valore 0 come nell’esempio, il sistema attenderà indefinitivamente , altrimenti è possibile passare un valore espresso in millisecondi, come valore di attesa.
cv2.destroyAllWindows() è un metodo che distrugge/chiude tutte le finestre attive.
Dunque riassumendo i vari punti avremo:
import cv2 img = cv2.imread('esempio1.jpg',1) cv2.imshow('Image',img) cv2.waitKey(0) cv2.destroyAllWindows()
ed ecco il risultato :
In modo analogo è possibile scrivere sul file system un’immagine in un file:
cv2.imwrite('esempio.png',img)
A questo punto ti starai chiedendo ma sarà così facile gestire, anche, i flussi video? ebbene si. Per accedere al flusso del webcam è possibile usare un’interfaccia specifica VideoCaputure:
video = cv2.VideoCapture(0)
ove il parametro passato, è il device id.
Per caricare un video da un file basterà passare come parametro il path del file video.
video = cv2.VideoCapture("video.mpg")
a questo punto, abbiamo gli elementi per creare un piccolo esempio, che ci permetterà di gestire un video, trattare i singoli frame come immagini e modificarli in real time a nostro piacimento.
L’esempio seguente ci consentirà di acquisire il flusso video di una webcam e di gestire i frames in sequenza.
import cv2 video = cv2.VideoCapture(0) while(1): ret, frame = video.read() cv2.imshow('Video Modificato',frame) if cv2.waitKey(1) & 0xFF == ord('q'): break video.release() cv2.destroyAllWindows()
Proviamo a riscrivere lo stesso codice cercando di applicare al video una trasformazione da RGB (RED,GREEN,BLUE) a scala di grigi:
import cv2 video = cv2.VideoCapture(0) while(1): ret, frame = video.read() frame_transformed_to_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.imshow('Video Modificato',frame_transformed_to_gray) if cv2.waitKey(1) & 0xFF == ord('q'): break video.release() cv2.destroyAllWindows()
Prima di chiudere questo articolo facciamo un ultimo esempio ovvero, proviamo a disegnare in ogni frame del video, un quadrato posizionato a 10px dal top e da sinistra, largo 100px ed alto 100px, di colore rosso (espresso in formato RGB) e spessore 3px. Al codice precedente basterà aggiungere :
cv2.rectangle(frame, (10, 10), (110,110), (0,0, 255), 3)
per una migliore lettura utilizziamo nel codice qualche variabile:
import cv2 video = cv2.VideoCapture(0) left=10 top=10 right=110 bottom=110 while(1): ret, frame = video.read() cv2.rectangle(frame, (left, top), (right, bottom), (0,0, 255), 3) cv2.imshow('Video Modificato',frame) if cv2.waitKey(1) & 0xFF == ord('q'): break video.release() cv2.destroyAllWindows()
il risultato è un software che sarà in grado di catturare un flusso video real time da una webcam e disegnarci su un oggetto.
Sono amante della tecnologia e delle tante sfumature del mondo IT, ho partecipato, sin dai primi anni di università ad importanti progetti in ambito Internet proseguendo, negli anni, allo startup, sviluppo e direzione di diverse aziende; Nei primi anni di carriera ho lavorato come consulente nel mondo dell’IT italiano, partecipando attivamente a progetti nazionali ed internazionali per realtà quali Ericsson, Telecom, Tin.it, Accenture, Tiscali, CNR. Dal 2010 mi occupo di startup mediante una delle mie società techintouch S.r.l che grazie alla collaborazione con la Digital Magics SpA, di cui sono Partner la Campania, mi occupo di supportare ed accelerare aziende del territorio .
Attualmente ricopro le cariche di :
– CTO MareGroup
– CTO Innoida
– Co-CEO in Techintouch s.r.l.
– Board member in StepFund GP SA
Manager ed imprenditore dal 2000 sono stato,
CEO e founder di Eclettica S.r.l. , Società specializzata in sviluppo software e System Integration
Partner per la Campania di Digital Magics S.p.A.
CTO e co-founder di Nexsoft S.p.A, società specializzata nella Consulenza di Servizi in ambito Informatico e sviluppo di soluzioni di System Integration, CTO della ITsys S.r.l. Società specializzata nella gestione di sistemi IT per la quale ho partecipato attivamente alla fase di startup.
Sognatore da sempre, curioso di novità ed alla ricerca di “nuovi mondi da esplorare“.
Comments