Wykrywanie twarzy z pliku video-czy odpowiedni kod


(przemeks91) #1

Witam,

#include „cv.h”
#include „highgui.h”
#include stdio.h
CvCapture* vid = cvCreateCameraCapture(0);
cvNamedWindow("detekcja twarzy", CV_WINDOW_AUTOSIZE);
cvQueryFrame(vid);
double fps = 25;
int odstep_miedzy_klatkami = 1000 / fps;
 
// kolory do zaznaczania twarzy
static CvScalar kolory[] = {
{{19.0,69.0,139.0,0.0}},
{{63.0,133.0,205.0,0.0}},
{{96.0,164.0,244.0,0.0}},
};
 
// deklarujemy pamiec na obliczenia
CvMemStorage * storage = cvCreateMemStorage(0);
 
// tworzymy klasyfikator
// jako agrument musimy podac siezke do pliku z efektem treningu klasyfikatora
CvHaarClassifierCascade * haar = (CvHaarClassifierCascade*) cvLoad("/usr/local/share/opencv/haarcascades/haarcascade_frontalface_alt.xml");
 
while (true)
{
IplImage* ramka = cvQueryFrame(vid);
 
if (ramka == 0)
break;
 
// czyscimy bufor
cvClearMemStorage(storage);
 
// skala
double skala = 1.5;
 
// przygotowujemy obrazy posrednie
IplImage *temp = cvCreateImage(cvSize(ramka-width, ramka-height), 8, 1);
IplImage *temp2 = cvCreateImage(cvSize(cvRound(ramka-width / skala), cvRound(ramka-height / skala)), 8, 1);
 
// zamieniamy kolory na skale szarosci
cvConvertImage(ramka, temp, CV_BGR2GRAY);
 
// zmniejszamy czarno-bialy obraz
cvResize(temp, temp2, CV_INTER_LINEAR);
 
// szukamy twarzy w danej ramce
CvSeq *wynik = cvHaarDetectObjects(temp2, haar, storage, 1.1, 3, CV_HAAR_DO_CANNY_PRUNING, cvSize(30,30));
 
// iterujemy po wszystkich wynikach
for (int i = 0; i (wynik ? wynik-total : 0); i++)
{
// pobieramy prostokat z pozycja wskazujaca twarz
CvRect * twarz = (CvRect*) cvGetSeqElem(wynik, i);
 
 
// ustalamy dwa punkty po przekatnej prostokata
CvPoint punkt1 = cvPoint(cvRound(twarz-x * skala),cvRound(twarz-y * skala));
CvPoint punkt2 = cvPoint(cvRound((twarz-x + twarz-width)* skala),cvRound((twarz-y + twarz-height) * skala));
 
// rysujemy prostokat zaznaczajacy twarz na obrazie
cvRectangle(ramka,punkt1,punkt2,kolory[i%3],2);
 
}
 
 
cvShowImage("detekcja twarzy", ramka);
 
cvReleaseImage(temp);
cvReleaseImage(temp2);
 
int c = cvWaitKey(odstep_miedzy_klatkami);
if (c == 'k')
break;
 
}
 
cvReleaseHaarClassifierCascade(haar);
cvDestroyAllWindows();
cvReleaseCapture(vid);

niestety nie wiem czy nadaje się on do wykonania mojego zadania. Program napisany jest z wykorzystaniem biblioteki OpenCV. Czy program takiego typu najlepiej pisać w postaci konsolowej czy z wykorzystaniem interfejsu (np. Windows Form Application)? Jestem trochę początkujący w programowaniu dlatego proszę o pomoc.


#2

Do processingu grafiki i ogólnie video polecam bibliotekę AForge przeznaczoną na platformę .NET.


(Frankfurterium) #3

Masz samodzielnie napisać program, ale znalazłeś gotowca i nawet nie potrafisz stwierdzić, czy działa? Zacznij od podstaw albo zmień szkołę/hobby, bo daleko na czymś takim nie zajedziesz.

 

 

Co do samej metody - używałem kiedyś OpenCV do wykrywania cech twarzy z podsuniętych jej zdjęć. Zdjęcia musiały być dobrej jakości i wykonane dokładnie od frontu, bo inaczej biblioteka wykrywała nos na czole albo usta na oku. Może z całymi twarzami idzie jej lepiej, ale...