(Ders 44) OpenCV ile İç İçe Haar Cascade (C++)

(Ders 32) OpenCV ile Resimden Yüz Bulma (C++)
(Ders 51) OpenCV ile Göz Bebeği Algılama ve Göz Takibi (C++)

Size faydalı olduysa, sosyal medyada paylaşarak bize destek olun. Teşekkürler.

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:

Size faydalı olduysa, sosyal medyada paylaşarak bize destek olun. Teşekkürler.

(Ders 32) OpenCV ile Resimden Yüz Bulma (C++)
(Ders 51) OpenCV ile Göz Bebeği Algılama ve Göz Takibi (C++)