Merhaba arkadaşlar bugün sizlerle önceki makalemde de bahsetmiş oldum EmguCV kütüphanesini kullanarak bir
uygulama yapacağız .Uygulamanın amacı başlıktan da anlaşılacağı üzere yüz,göz ,burun ve ağız algılama.
Peki bunu nasıl yapacağız? Sizinde bildiğiniz gibi bir nesneyi aramak için önce ilgili nesneyi sisteme tanımlamamız gerekir .Aynı canlılarda olduğu gibi biz de bir nesneyi tanıyabilmemiz için önceden o nesneyle ilgili bilgileri tanımlamamız,bilmemiz,öğrenmemiz gerekir.Bilgisayarda da aynı şekilde , gelen görüntüleri karşılaştıracak
nesnelerin şeklini, şemallerini ,rengini vs yüklememiz gerekmektedir.
Nesneleri/şekilleri/şemalleri programatik olarak tanımlanmış ve o nesnelerin binlerce pozitif ve negatifi ile hazırlanmış xml uzantılı veri setlerine casecade sınıflandırıcıları denmektedir. Cascade veri setlerinde; pozitif tanımlanan görüntülerin istenilen nesnenin bulunduğu, negatif tanımlanan görüntülerin ise istenilen nesnenin bulunmadığı durumları gösterir.
Örneğimizde içerik olarak yüz, göz, ağız ve burun olduğu için bu nesneleri tanımlamamız gerekecektir.
İşte böyle bir durumda OpenCV(EmguCV’de) bunlar ve bunlara benzer birçok nesneyi hali hazırda tanımlamış olarak bizlere sunar. Buradan işimize yarayacak olan tüm cascade dosyalarını elde edebilirsiniz.

Gördüğünüz gibi birçok nesne cascade veri seti olarak tanımlanmış . Biz yüz, göz, burun ve ağız için yukarıda işaretlediğim cascade dosyalarını kullanacağız. Tabi bunlar dışında piyasada çokça cascade dosyasının mevcut.
Öncelikle şu adresteki makalemizde anlatıldığı gibi EmguCV ile ilgili tüm dll entegrasyon işlemlerini yapmayı unutmayınız.Şimdi bu işlemlerin yapıldığını varsayarak ve konumuza devam ediyoruz.
Cascade dosyalarımızı erişim kolaylığı için projemizdeki "bin"->"debug" dosyasının içine koyalım.
Şimdi sıra geldi kodlamaya.
İlk önce kameraya erişimi sağlayalım
private void Form1_Load(object sender, EventArgs e)
{
Capture capture = new Capture();
capture.Start();
capture.ImageGrabbed += (a, b) =>
{
Bitmap image = capture.RetrieveBgrFrame().Bitmap;
pictureBox1.Image = image;
};
}
Şimdide Cascade dosyalarını uygulamamıza dahil ediyoruz.
private void Form1_Load(object sender, EventArgs e)
{
Capture capture = new Capture();
capture.Start();
HaarCascade haaryuz = new HaarCascade("haarcascade_frontalface_default.xml");
HaarCascade haargoz = new HaarCascade("haarcascade_eye.xml");
HaarCascade haaragiz = new HaarCascade("haarcascade_mcs_mouth.xml");
HaarCascade haarburun = new HaarCascade("haarcascade_mcs_nose.xml");
capture.ImageGrabbed += (x, y) =>
{
var image = capture.RetrieveBgrFrame();
pictureBox1.Image = image.ToBitmap();
};
}
HaarCascade sınıfı cascade dosyalarını tuttuğumuz sınıftır. Şimdi bu sınıf aracılığı ile programatik veri olarak tutulan nesneyi elimizdeki görüntüde DetectHaarCascade metoduyla bulacağız.
private void Form1_Load(object sender, EventArgs e)
{
Capture capture = new Capture();
capture.Start();
HaarCascade haaryuz = new HaarCascade("haarcascade_frontalface_default.xml");
HaarCascade haargoz = new HaarCascade("haarcascade_eye.xml");
HaarCascade haaragiz = new HaarCascade("haarcascade_mcs_mouth.xml");
HaarCascade haarburun = new HaarCascade("haarcascade_mcs_nose.xml");
capture.ImageGrabbed += (x, y) =>
{
var image = capture.RetrieveBgrFrame();
iff (image != null)
{
//Elde edilen kamera görüntüsü Image<Gray, byte> nesnesine convert ediliyor.
var grayimage = image.Convert<Gray, byte>();
//grayimage nesnemizde DetectHaarCascade metodu aracılığıyla HaarCascade
//nesnesinde tutulan cascade aranır.
MCvAvgComp[][] Yuzler = grayimage.DetectHaarCascade(haaryuz, 1.2, 5, HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(15, 15));
MCvAvgComp[][] Gozler = grayimage.DetectHaarCascade(haargoz, 1.2, 10, HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(15, 15));
MCvAvgComp[][] Agizlar = grayimage.DetectHaarCascade(haaragiz, 1.2, 100, HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(15, 15));
MCvAvgComp[][] Burunlar = grayimage.DetectHaarCascade(haarburun, 1.2, 50, HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(15, 15));
//Bulunan tüm nesnelerin koordinatları elde edilip gerekli çizim
//işlemi gerçekleştirir.
foreach (MCvAvgComp yuz in Yuzler[0])
image.Draw(yuz.rect, new Bgr(Color.Red), 2);
foreach (MCvAvgComp goz in Gozler[0])
image.Draw(goz.rect, new Bgr(Color.Black), 2);
foreach (MCvAvgComp agiz in Agizlar[0])
image.Draw(agiz.rect, new Bgr(Color.Blue), 2);
foreach (MCvAvgComp burun in Burunlar[0])
image.Draw(burun.rect, new Bgr(Color.Yellow), 2);
}
pictureBox1.Image = image.ToBitmap();
};
}
Eveeet her şeyi doğru bir şekilde yaptıysanız eğer elde elilecek görüntü şu şekildedir:
