Riconoscimento facciale con OpenCV: input da webcam o da file video mp4

In questo articolo vedremo come effettuare il riconoscimento facciale con OpenCV prendendo come input, prima, il video proveniente dalla webcam e dopo, un file video in formato .mp4.

Come fare quindi per effettuare il riconoscimento facciale prendendo in input le immagini della webcam? Vediamolo subito con un video tutorial. Qui di seguito il video tutorial:

Come precedentemente spiegato nel video tutorial vi lasciamo il codice da poter copiare e/o modificare. Nel codice sono presenti vari commenti che spiegano i significati di quanto è stato scritto.

//Include che ci servono
#include "stdafx.h"
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/objdetect.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

//Namespace
using namespace cv;
using namespace std;

//Variabili e dichiarazioni varie
// Load cascate classifier placed in sulution folder
CascadeClassifier detector;
string cascadeName = "C:\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_default.xml";
bool loaded = detector.load(cascadeName);
//Parametri per la detectMultiscale del Cascade Classifier. Questa volta messi nelle variabili. Ne abbiamo due in più rispetto allo scorso tutorial
int groundThreshold = 2;
double scaleStep = 1.1;
//Size minima dell'oggetto da detectare. Gli oggetti più piccoli vengono ignorati.
Size minimalObjectSize(80, 80);
//Size massima dell'oggetto da detectare. Gli oggetti più grandi vengono ignorati.
Size maximalObjectSize(200, 200);
// Vector delle facce trovate
std::vector<Rect> facce;

int main()
{
	//Per la capture dalla webcam. Passo il parametro 0 perché ipotizzo che stiamo usando un computer con una singola webcam, ad esempio un laptop
	VideoCapture cap(0);
	cap.open(0);
	Mat img;
	//Ciclo for che va in loop, quindi "continua a girare".
	for (;;)
	{
		//Mettiamo l'immagine dalla web cam al Mat
		cap >> img;
		//Convertiamo in bianco e nero
		Mat image_grey;
		cvtColor(img, image_grey, CV_BGR2GRAY);
		//Puliamo il vector, non si sa mai
		facce.clear();
		//Via con il riconoscimento facciale!
		detector.detectMultiScale(image_grey, facce, scaleStep, groundThreshold, 0 | 2, minimalObjectSize, maximalObjectSize);
		//Disegnaimo un cerchio, come nello scorso tutorial, attorno alla faccia trovata
		if (facce.size() > 0) {
			for (int i = 0; i <= facce.size() - 1; i++)
			{
				Point center(facce[i].x + facce[i].width*0.5, facce[i].y + facce[i].height*0.5);
				ellipse(img, center, Size(facce[i].width*0.5, facce[i].height*0.5), 0, 0, 360, Scalar(96, 158, 0), 3, 7, 0);
			}
		}

		//Apriamo una finestra che ci mostri il risultato
		imshow("Riconoscimento da webcam", img);
		//Ogni 20 millisecondi riparte da capo il ciclo
		waitKey(20);

	}
	return 0;
}

Sempre come avete già visto nel video tutorial, è possibile utilizzare una variante di questo codice per prendere in input un file in formato .mp4. Qui di seguito la variante valida per prendere come input il file .mp4.

//Include che ci servono
#include "stdafx.h"
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/objdetect.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

//Namespace
using namespace cv;
using namespace std;

//Variabili e dichiarazioni varie
// Load cascate classifier placed in sulution folder
CascadeClassifier detector;
string cascadeName = "C:\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_default.xml";
bool loaded = detector.load(cascadeName);
//Parametri per la detectMultiscale del Cascade Classifier. Questa volta messi nelle variabili. Ne abbiamo due in più rispetto allo scorso tutorial
int groundThreshold = 5;
double scaleStep = 1.1;
//Size minima dell'oggetto da detectare. Gli oggetti più piccoli vengono ignorati.
Size minimalObjectSize(190, 190);
//Size massima dell'oggetto da detectare. Gli oggetti più grandi vengono ignorati.
Size maximalObjectSize(500, 500);
// Vector delle facce trovate
std::vector<Rect> facce;

int main()
{
	//Al posto della webcam gli do in input un file video mp4
	VideoCapture cap("C:\\Users\\ZakuModerno\\Desktop\\VideoTestOCV5sec.mp4");
	cap.open("C:\\Users\\ZakuModerno\\Desktop\\VideoTestOCV5sec.mp4");
	Mat img;
	//Ciclo for che va in loop, quindi "continua a girare".
	for (;;)
	{
		//Mettiamo l'immagine dalla web cam al Mat
		cap >> img;
		//Verifico se l'img è vuota o no prima di proseguire
		if (!img.empty()) {
			//Convertiamo in bianco e nero
			Mat image_grey;
			cvtColor(img, image_grey, CV_BGR2GRAY);
			//Puliamo il vector, non si sa mai
			facce.clear();
			//Via con il riconoscimento facciale!
			detector.detectMultiScale(image_grey, facce, scaleStep, groundThreshold, 0 | 2, minimalObjectSize, maximalObjectSize);
			//Disegnaimo un cerchio, come nello scorso tutorial, attorno alla faccia trovata
			if (facce.size() > 0) {
				for (int i = 0; i <= facce.size() - 1; i++)
				{
					Point center(facce[i].x + facce[i].width*0.5, facce[i].y + facce[i].height*0.5);
					ellipse(img, center, Size(facce[i].width*0.5, facce[i].height*0.5), 0, 0, 360, Scalar(96, 158, 0), 3, 7, 0);
				}
			}

			//Apriamo una finestra che ci mostri il risultato
			imshow("Riconoscimento da webcam", img);
		}
		//Ogni 20 millisecondi riparte da capo il ciclo
		waitKey(20);

	}
	return 0;
}

Vuoi rimanere aggiornato sulle nostre iniziative?