English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Spiegazione dettagliata del principio e degli esempi di riconoscimento facciale con OpenCV

Informazioni su OpenCV

OpenCV è una libreria di visione artificiale open source di Intel (Versione ComputerEssa è composta da una serie di funzioni C e una piccola quantità di classi C++, che implementano molti algoritmi comuni di elaborazione delle immagini e visione artificiale.

OpenCV possiede un'API di livello medio e alto, cross-platform, che include oltre 300 funzioni in C. Non dipende da altri pacchetti esterni - anche se è possibile utilizzare alcuni pacchetti esterni. OpenCV è gratuito per applicazioni non commerciali e commerciali. Inoltre, OpenCV fornisce l'accesso all'hardware, può accedere direttamente alla telecamera e OpenCV offre anche un sistema GUI (Graphical User Interface) semplice: highgui. Costruiremo questa rilevamento del volto utilizzando alcuni metodi forniti da OpenCV.rilevamento faccialeprogramma)

Pacchetto Python di OpenCV 

OpenCV è scritto in C/C++, se si desidera utilizzarlo in altri linguaggi, possiamo impacchettare i file delle librerie dinamiche, fortunatamente, ci sono molti pacchetti di questo tipo in Python, in questo articolo viene utilizzato Cvtypes.

In effetti, molti pacchetti in Python sono di terze parti, ad esempio PIL (Python Image Library) è un pacchetto di elaborazione delle immagini implementato in C, pacchettizzato in Python, questi pacchetti ti permettono di utilizzare questi API come se fossero funzioni native di Python.

Principio di rilevamento del volto

La rilevamento del volto è una parte della rilevamento degli obiettivi (object detection), che riguarda principalmente due aspetti

1. Prima di tutto, effettuare una statistica di probabilità sul obiettivo da rilevare, in modo da conoscere alcune caratteristiche dell'oggetto da rilevare e costruire un modello di rilevamento dell'obiettivo.
2. Utilizzare il modello ottenuto per abbinare l'immagine di input, se c'è un abbinamento, esportare l'area di abbinamento, altrimenti non fare nulla. 

Visione computerizzata

Il sistema visivo del computer è molto diverso dall'occhio umano, ma ci sono anche alcune somiglianze. L'occhio umano vede gli oggetti attraverso la luce riflessa sugli oggetti che stimola le cellule di fotosensibilità dell'occhio, e poi i nervi visivi formano l'immagine dell'oggetto nel cervello. Il computer vede le cose attraverso la telecamera in modo molto più semplice, in breve, è una matrice di numeri. Questi numeri indicano la forza della luce emessa dall'oggetto, il sensore di luce della telecamera trasforma i segnali luminosi in segnali digitali, quantizzandoli in una matrice.

Come ottenere la conclusione: "Questo è un volto umano" da questi numeri è una cosa piuttosto complessa. Il mondo fisico è colorato, di solito, le immagini colorate nel computer sono composte da una serie di canali di colore accumulati, ad esempio, le immagini in modalità RGB, hanno canali rosso (Red), verde (Green) e blu (Blue), questi tre canali sono immagini a scala di grigio, ad esempio, un punto è rappresentato da 8 bit, quindi un canale può rappresentare 2^8=256 gradi di scala di grigio. Così, quando si sommano tre canali, si possono rappresentare 3*8=24 bit di colore, che è quello che chiamiamo 24 bit true color.

Elaborare tali immagini è senza dubbio una cosa complessa, quindi è necessario prima convertire le immagini a colori in immagini a grigio, in modo da ridurre la quantità di dati (ad esempio, il modello RGB può essere ridotto a 1/3 dell'immagine originale), e allo stesso tempo, eliminare alcuni segnali di rumore. Prima di tutto, convertire l'immagine in scala di grigio, quindi aumentare la contrasto di questa immagine a grigio, in modo da rendere più scuri i luoghi scuri e più luminosi i luoghi luminosi. Dopo questo trattamento, l'immagine diventa più facile da rilevare dall'algoritmo.

Tabella catenata delle caratteristiche Haar

OpenCV utilizza una tabella catenata di caratteristiche Haar per la detezione degli oggetti, questa tabella catenata contiene classificatori boost. Prima, si utilizzano le caratteristiche Haar dei campioni per addestrare il classificatore, ottenendo un classificatore boost catenato. Il modo di addestramento include due aspetti:

1. Esempio di campione positivo, ovvero il campione da controllare
2. Esempio di campione negativo, qualsiasi immagine casuale

Prima di tutto, queste immagini devono essere uniformate in dimensioni diverse, questo processo viene chiamato normalizzazione, quindi si procede con la statistica. Una volta completato il classificatore, può essere utilizzato per rilevare l'area di interesse nell'immagine di input, di solito, l'immagine di input è più grande dei campioni, quindi è necessario muovere la finestra di ricerca, per cercare obiettivi di diverse dimensioni, il classificatore può cambiare la propria dimensione in proporzione, quindi potrebbe essere necessario scansionare l'immagine di input più volte.

Cos'è un classificatore catenato? Un classificatore catenato è un grande classificatore costituito da una serie di classificatori semplici concatenati, la finestra di rilevamento passa attraverso ogni classificatore, se la finestra passa attraverso tutti i classificatori, può essere giudicata come area di interesse. Allo stesso tempo, per considerare il problema dell'efficienza, il classificatore più rigoroso può essere messo all'inizio della catena di classificatori, in modo da ridurre il numero di match.

Il classificatore di base utilizza le caratteristiche Haar come input, con 0/1 come output, 0 indica non corrispondente, 1 indica corrispondente.

Caratteristiche Haar

 

 Caratteristiche di confine, includono quattro tipi
 Caratteristiche lineari, includono otto tipi
 Il centro è intorno alla caratteristica, include due tipi

Quando si scansiona l'immagine da controllare, prendiamo come esempio la caratteristica di confine (a), come menzionato in precedenza, l'immagine nel computer è una matrice di numeri, il programma calcola prima il valore di grigio della finestra intera x, quindi calcola il valore di grigio nero della scatola rettangolare y, quindi calcola il valore di (x-2y), il valore ottenuto viene confrontato con x, se questa rapporto è entro un certo intervallo, allora indica che l'area di scansione attuale dell'immagine da controllare corrisponde alla caratteristica di confine (a), quindi continua a scansionare.

A more detailed description of this algorithm is beyond the scope of this article, and more information can be obtained from the reference resources.

Non-fixed size target detection

Since the target detection is based on video stream, it is unlikely that we will know the size of the target in advance. This requires that the classifier in our cascade table has the ability to increase (or decrease) proportionally. So, when a small window moves across the entire image to be detected without finding the target, we can adjust the size of the classifier and continue the detection until the target is detected or the size of the window is comparable to the size of the image to be detected.

Step 1:Image preprocessing

After obtaining a frame (an image) from the camera, we need to preprocess this image first:
1. Convert the image from RGB mode to grayscale and then convert the grayscale image
2. Perform histogram equalization on the grayscale image

These two steps are very simple in OpenCV:

image_size = cv.cvGetSize(image)# Get the original image size 
grayscale = cv.cvCreateImage(image_size, 8, 1)# Create an empty grayscale image 
cv.cvCvtColor(image, grayscale, cv.CV_BGR2GRAY)# Conversion 
storage = cv.cvCreateMemStorage(0)# Create a new storage area for later use 
cv.cvClearMemStorage(storage) 
cv.cvEqualizeHist(grayscale, grayscale)# Equalization of the histogram of the grayscale image 

Step 2:Detect and mark the target

In OpenCV, the model for face detection has been established as an XML file, which contains the training results of the harr feature classifier mentioned above. We can skip the process of building the cascade table by loading this file. With the cascade table, we just need to pass the image to be detected and the cascade table to the OpenCV target detection algorithm to get a set of detected faces.

# detect objects 
cascade = cv.cvLoadHaarClassifierCascade('haarcascade_frontalface_alt.xml', 
      cv.cvSize(1,1)) 
faces = cv.cvHaarDetectObjects(grayscale, cascade, storage, 1.2, 2,) 
    cv.CV_HAAR_DO_CANNY_PRUNING, 
    cv.cvSize(50, 50))#Impostare la dimensione minima del viso a 50x50 pixel 
if faces: 
 print 'face detected here', cv.cvGetSize(grayscale) 
 for i in faces: 
 cv.cvRectangle(image, cv.cvPoint( int(i.x), int(i.y)), 
   cv.cvPoint(int(i.x + i.width), int(i.y + i.height)), 
   cv.CV_RGB(0, 255, 0), 1, 8, 0)#Disegnare un rettangolo verde 

Passaggio tre:Disegnare la finestra del video con highgui

highgui.cvNamedWindow ('camera', highgui.CV_WINDOW_AUTOSIZE) 
highgui.cvMoveWindow ('camera', 50, 50) 
highgui.cvShowImage('camera', detimg) 

Si può vedere che l'API di OpenCV è molto chiara, e con il wrapper di Python, il codice può essere molto piccolo. Bene, possiamo vedere i risultati dell'esecuzione del programma: 

Poiché lo stream video è dinamico, possiamo utilizzare un ciclo infinito all'inizio del programma, nel quale, ogni volta, leggiamo un frame dal video, trasmettiamo questo frame al modulo di rilevamento del viso, che lo etichetta (se c'è una faccia) e poi lo restituisce, il programma principale riceve questo frame e aggiorna la finestra di visualizzazione.

Altre caratteristiche di OpenCV

Rilevamento dei bordi di Laplace

def laplaceTransform(image): 
 laplace = None 
 colorlaplace = None 
 planes = [None, None, None] 
 image_size = cv.cvGetSize(image) 
 if not laplace: 
 for i in range(len(planes)): 
  planes[i] = cv.cvCreateImage(image_size, 8, 1) 
 laplace = cv.cvCreateImage(image_size, cv.IPL_DEPTH_16S, 1) 
 colorlaplace = cv.cvCreateImage(image_size, 8, 3) 
 cv.cvSplit(image, planes[0], planes[1], planes[2], None) 
 for plane in planes: 
 cv.cvLaplace(plane, laplace, 3) 
 cv.cvConvertScaleAbs(laplace, plane, 1, 0) 
 cv.cvMerge(planes[0], planes[1], planes[2], None, colorlaplace) 
 colorlaplace.origin = image.origin 
 return colorlaplace 

Immagine di esempio:

CVtypes include un esempio di istogramma di spazio dei colori delle immagini:

Messaggio di chiusura

OpenCV ha funzionalità molto potenti e offre un gran numero di implementazioni di algoritmi, il contenuto menzionato nell'articolo è solo una piccola parte della visione computerizzata. I lettori possono considerare di etichettare i volti raccolti per riconoscere i volti di persone specifiche. Oppure considerare di portare la detezione dei volti su Internet per implementare la sorveglianza remota. Immagina un momento in cui le macchine prive di vita possono sembrare pensanti attraverso i nostri pensieri e movimenti, questo fatto è molto interessante.

Questo è tutto il contenuto dell'articolo, speriamo che sia utile per il tuo studio e che tu sostenga fortemente la guida a urla.

Dichiarazione: il contenuto di questo articolo è stato raccolto da Internet, è di proprietà del rispettivo autore, il contenuto è stato caricato autonomamente dagli utenti di Internet, questo sito non detiene i diritti di proprietà, non è stato sottoposto a modifica editoriale umana e non assume responsabilità legali correlate. Se trovi contenuti sospetti di copyright, ti preghiamo di inviare una e-mail a notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare, fornendo prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente il contenuto sospetto di violazione del copyright.

Ti potrebbe interessare