(Ders 44) OpenCV ile İç İçe Haar Cascade (C++)
Program Açıklaması:
İç içe iki sınıflandırıcı kullanımına bazen ihtiyacımız olabilir.
Bu örnekte önce yüz bulunuyor daha sonra yüzün içindeki gözler bulunuyor.
Ekran Görüntüsü:
Program Kodu:
#include "opencv2/objdetect/objdetect.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <stdio.h> using namespace std; using namespace cv; void goruntuAnalizi(Mat frame); //Global değişkenler String yuzXml = "haarcascade_frontalface_alt.xml"; String gozlerXml = "haarcascade_eye_tree_eyeglasses.xml"; CascadeClassifier yuzSiniflandirici; CascadeClassifier gozSiniflandirici; string pencereAdi = "Yuz ve Goz Tanima"; RNG rng(12345); int main(int argc, const char** argv) { Mat frame; //xml dosyaları yükleniyor if (!yuzSiniflandirici.load(yuzXml)) { printf("--(!)xml dosyasi yuklenemedi\n"); return -1; }; if (!gozSiniflandirici.load(gozlerXml)) { printf("--(!)xml dosyasi yuklenemedi\n"); return -1; }; //!!!Dahili webcam kullanılıyorsa burası 0 olmalı VideoCapture capture(0); if (capture.isOpened()) { while (true) { capture.read(frame); //Eğer frame varsa işleme başla //Webcam olduğu için frame olmaması imkansız:) //Burası videolar için böyle bırakıldı //Videoların sonu vardır çünkü:) //Frame'ler bir yere gelince biter:) if (!frame.empty()) { goruntuAnalizi(frame); } else { printf("Okunacak frame kalmadi"); break; } if (waitKey(30) == 27) //27 ascii tus karsiligi ESC tusudur. { cout << "Esc ile cikis yapildi" << endl; destroyAllWindows(); //pecere kapandı system("pause"); return 0; } } } return 0;//goruntu yoksa programı bitir } void goruntuAnalizi(Mat frame) { std::vector<Rect> yuzler; Mat griFrame; cvtColor(frame, griFrame, CV_BGR2GRAY); equalizeHist(griFrame, griFrame); //Yüz algılanıyor yuzSiniflandirici.detectMultiScale(griFrame, yuzler, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30)); for (size_t i = 0; i < yuzler.size(); i++) { Point center(yuzler[i].x + yuzler[i].width*0.5, yuzler[i].y + yuzler[i].height*0.5); ellipse(frame, center, Size(yuzler[i].width*0.5, yuzler[i].height*0.5), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0); Mat bulunanYuz = griFrame(yuzler[i]); std::vector<Rect> gozler; //Yüzün içindeki gözleri algılanıyor gozSiniflandirici.detectMultiScale(bulunanYuz, gozler, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30)); for (size_t j = 0; j < gozler.size(); j++) { Point center(yuzler[i].x + gozler[j].x + gozler[j].width*0.5, yuzler[i].y + gozler[j].y + gozler[j].height*0.5); int radius = cvRound((gozler[j].width + gozler[j].height)*0.25); circle(frame, center, radius, Scalar(255, 0, 0), 4, 8, 0); } } //Değişiklikleri form'da göster imshow(pencereAdi, frame); }
Program Kodunu İndir: