Riconoscimento Persone (pedoni): input video da Drone

In questo articolo vedremo come effettuare il riconoscimento dei pedoni con OpenCV prendendo come input un video aereo girato con un drone, in questo caso useremo una file .mp4, tuttavia volendo è possibile anche utilizzare un video preso da webcam o da Drone in tempo reale (vedi tutorial precedente).
NB: in questo tutorial vi mostriamo il funzionamento del codice. Le spiegazioni avanzate saranno presenti nei tutorial successivi.

Come fare quindi per effettuare il riconoscimento pedoni prendendo in input un video girato da un drone? Vediamolo subito con un video tutorial. Qui di seguito il video tutorial:

Qui di seguito vi lasciamo il codice per poter replicare quello che abbiamo fatto anche noi nel video.

//Include
#include "stdafx.h"
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(int argc, const char * argv[])
{
	//Come abbiamo visto nello scorso tutorial, prendo l'input da un file mp4
	//Volendo potrei anche prendere l'input dalla webcam, da una camera di sorveglianza, o dal feed di un drone trasferito in live streaming sul computer
	VideoCapture cap("C:\\Users\\ZakuModerno\\Desktop\\ExportFinalPersone.mp4");
	//L'immagine, come già visto negli altri tutorial
	Mat img;
	//Questa volte le cose sono un poco diverse, non chiameremo la classica haarcascade, ma useremo l'hogdetector
	HOGDescriptor hog;
	hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
	//Ciclone. 
	//Ovvero un ciclo molto grande. 
	//E' una battuta. 
	//Qui iniziamo il loop di individuazione persone e display del video. Questo ciclo, esattamente come nel tutorial precedente, è un loop.
	for (;;)
	{
		//Dal cap alla variabiole che contiene l'immagine
		cap >> img;
		//Vector che continee i risultati
		vector<Rect> found, found_filtered;
		//Via alla detection
		hog.detectMultiScale(img, found, 0, Size(8, 8), Size(32, 32), 1.05, 1);

		//Disegniamo un rettangolo intorno alla persona trovata (al posto dei cerchi/ellissi usati negli scorsi tutorial)
		size_t i, j;
		for (i = 0; i<found.size(); i++)
		{
			Rect r = found[i];
			for (j = 0; j<found.size(); j++)
				if (j != i && (r & found[j]) == r)
					break;
			if (j == found.size())
				found_filtered.push_back(r);
		}
		for (i = 0; i<found_filtered.size(); i++)
		{
			Rect r = found_filtered[i];
			r.x += cvRound(r.width*0.1);
			r.width = cvRound(r.width*0.8);
			r.y += cvRound(r.height*0.06);
			r.height = cvRound(r.height*0.9);
			rectangle(img, r.tl(), r.br(), cv::Scalar(96, 158, 0), 2);
		}

		//Mostriamo il risultato finale. Come scritto prima uesta volta usiamo dei rettangoli, negli scorsi tutorial abbiamo usato cerchi/ellissi
		imshow("Individua Persone", img);

		//Ogni 20 millisecondi ripetiamo il ciclo
		waitKey(20);
		
	}
	return 0;
}

Vuoi rimanere aggiornato sulle nostre iniziative?