Face Recognition and Tracking con OpenCV (prima parte)

AI, INFORMATICA, INTELLIGENZA ARTIFICIALE

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, CVHightGUI, 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.

seconda parte >>

Se vuoi farmi qualche richiesta o contattarmi per un aiuto riempi il seguente form

    Comments