EMGU.CV Kullanarak WEBCam Üzerinden Yüz Belirleme Uygulaması

Bu yazımızda EMGU.CV wrapper bir başka deyişle EMGU.CV kütüphanesini kullanarak, WEBCam üzerinden yüz belirleme uygulaması gerçekleştirelim. Yüz belirleme diyorum, çünkü amacım webcamda görüntülenen insan yüzlerini dikdörtgen içine alma olacak. Bunu yüz tanıma olarak adlandıranlar mevcut ama tanıma aslında o yüzün kime ait olduğunu bulma gibi bir işlem bence. Yani benim yüzlerden oluşan bir veritabanım vardır. O yüz şablonları ile kameranın gördüğü yüz kıyaslanır ve o yüzün kime ait olduğu bulunur. Bu yüz tanıma. Ama kamerann görüntüsü üstünde yüzleri dikdörtgen içine, yuvarlak içine alma vs yüz belirleme işlemidir. Türkçeyi düzgün kullanmakla alakalı aslında. Neyse dersimiz edebiyat değil 😊 Amacımız telefoların fotoğraf çekerken gülümseme yakalaması, kişilerin yüzlerini yakalaması gibi bir uygulama.

EMGU.CV nedir?

Çok detayına girmeyeceğim ama genel bir tanımlama yaparsak, Open.CV frameworkünün .Net dilleri üzerinde kullanılabilmesi için oluşturulmuş olan bir wrapperidir. Warapper nedir? Wrapper bir ara kütüphanedir, yani Open CV, C++, C gibi ortamlarda direkt kullanılır. Ama ben bunu C# gibi bir pkatformda kullanmak istiyor isem, bu sefer bir ara kütüphaneye ihtiyacım var, işte bunlara wrapper diyoruz. Bu ara bilginin ardından konuya dönersek; yani şöyle diyelim, görüntü işleme için kullanılan bir dll kütüphanesidir EMGU.CV. Visual studio, Xamarin studio ve Unity tarafından derlenebilir. Windows, Linux, Mac OS X, iOS ve Androidde kullanılabilir.

EMGU.CV Projeye Nasıl Eklenir?

Bunun için windows form projesi oluşturduktan sonra sağda yer alan alanda projenize sağ tıklayıp, Manage Nuget Packages diyorum.

EMGU.CV Kullanarak WEBCam Üzerinden Yüz Belirleme Uygulaması

EMGU.CV kütüphanesini eklemem lazım. Arama kısmında EMGU.CV yazıyorum.

EMGU.CV seçiyor ve install diyerek yüklüyorum. Ekranda versiyona dikkat, Emgu.CV 4.1.1.3497 versiyonunu yükledim.

EMGU.CV Kullanarak WEBCam Üzerinden Yüz Belirleme Uygulaması

Yükleme esnasında lisans kabul etme sorgusu çıkar, kabul edin.

EMGU.CV Kullanarak WEBCam Üzerinden Yüz Belirleme Uygulaması

Başarı ile yüklendi mesajı aldıktan sonra sağda projemde References kısmına baktım ve eklendiğine dair referansları da görmüş oldum.

Daha sonra projemde solution explorer alanına tekrar dönüp, projem üzerinde sağ tıklıorum ve Rebuild seçiyorum.

EMGU.CV Kullanarak WEBCam Üzerinden Yüz Belirleme Uygulaması

Rebuild işlemi tamamlandıktan sonra ekranda aşağıdaki gibi bir bildirim çıkmalı.

EMGU.CV Kullanarak WEBCam Üzerinden Yüz Belirleme Uygulaması

Yani işlem başarılı demeli. (Projenizin adı da yazacaktır)

Daha sonra aşağıdaki bağlantıya giriniz;

https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_alt_tree.xml

Buradaki adresten önyüz tanıma için gerekli bir takım kodları alacağız. Downlod tuşuna bastığınızda tarayıcınızın özelliğine göre ya inecektir ya da yeni bir sayfada XML kodları açılacaktır. Eğer xml kodları açılırsa bu sayfada sağ tıklayıp, Farklı Kaydet deyin ve dosyayı bilgisayarınıza kaydedin.

Kaydettiğiniz yerdeki dokümanı kopyalayın, daha sonra projenizde solution explorer alanına dönün ve sağ tıklayıp, Paste deyin. Bendeki son durum aşağıdaki şekilde, dosyayı projeme ekledim.

EMGU.CV Kullanarak WEBCam Üzerinden Yüz Belirleme Uygulaması

Sonra eklediğiniz bu dokümana sağ tıklayın ve properties deyin. Veya Properties pencereniz altta ise doğrudan görünecektir zaten. Burada aşağıdaki şekilde ayarları yapın.

Build Action: None olacak.

Copy to Output Directory : Copy Always yapın.

EMGU.CV Kullanarak WEBCam Üzerinden Yüz Belirleme Uygulaması

EMGU.CV işlemim tamamlandı.

Projeye AFORGE.VIDEO.DIRECTSHOW kütüphanesi nasıl eklenir?

Şimdi AFORGE.VIDEO.DIRECTSHOW referans DLL dokümanlarını ekleyelim.

Aforge.NET kütüphanesi yine açık kaynaklı bir c# frameworküdür. Program geliştiriciler, bilimsel araştırma yapan kişier için özellikle görüntüleme işleme de veyapay zeka uygulamalarında kullanılması amacı ile geliştirilmiş bir kütüphanedir. Sadece bu iki alanda değil tabi, nöral ağlarda yani insan beyni ve sinir sistemini taklit eden yapay zeka uygulamalarında, genetik algoritmasında, fuzzy lojikte yani bulanık mantıkta, machine learning dediğimiz makine öğrenmesinde ve robotikte de çok kullanılır.

Aforge.Video.DirectShow kütüphanesinde DirectShow arayüzü vasıtası ile video kaynaklarına erişim sağlayan classlar mevcuttur. Bunlara örnek verirsek; usb web kameralar, görüntü yakalama aygıtları, video dosyaları örneklendirilebilir.

Yine projemizde sağ tıklayarak Manage Nuget Packages seçelim.

EMGU.CV Kullanarak WEBCam Üzerinden Yüz Belirleme Uygulaması

Daha sonra arama alanında AFORGE.VIDEO.DIRECTSHOW yazıp ilgili referans kütüphanesi dosyasını buluyor ve yüklüyorum.

EMGU.CV Kullanarak WEBCam Üzerinden Yüz Belirleme Uygulaması

Şimdi tekrar tasarımımıza dönelim:

Aşağıdaki araçları formuma sürüklüyorum:

  • 1 Adet Label : Text özelliğini Kamera yaptım.
  • 1 adet combobox : Name Özelliğini cmbKamera yaptım
  • 1 adet picturebox : BorderStyle özelliğini Fixed3D yaptım
  • 1 adet buton: Text Özelliğini Başla yaptım. Name özelliğini btnBasla yaptım.

Diğer kısımlar tamamen görsel değişiklikler.

EMGU.CV Kullanarak WEBCam Üzerinden Yüz Belirleme Uygulaması

Şimdi kodlarımıza dönebiliriz.

Formuma aşağıdaki kütüphane referanslarını ekliyorum:

using AForge.Video;
using AForge.Video.DirectShow;
using Emgu.CV;
using Emgu.CV.Structure;

FilterInfoCollection ve VideoCaptureDevice sınıfından nesnelerimi türettim. FilterInfoCollection cihazımdaki tüm kameraları, yakalama cihazlarını vs bulur. VideoCaptureDevice ise benim kullanacağım kamera için değişkenim olacak.

FilterInfoCollection Cihazlar;
VideoCaptureDevice kameram;

Formun load olayında bilgisayarıma bağlı olan dahili ve harici kameraları tarıyorum ve comboboxa ekliyorum. FilterInfo cihazdaki görüntü yakalama cihazları hakkında bilgi tutar. İlk bulduğu kamera ismi görünsün diye ilk atamayı yaptık, 0 verdik.

private void Form1_Load(object sender, EventArgs e)
        {
            Cihazlar = new FilterInfoCollection(FilterCategory.VideoInputDevice);

                        foreach (FilterInfo cihaz in Cihazlar)
            {
                cmbKamera.Items.Add(cihaz.Name);
            }
            
            cmbKamera.SelectedIndex = 0;

            kameram = new VideoCaptureDevice();

        }


       Projeme CascadeClassifier classını ekliyorum.Bu sınıftan türettiğim nesne sayesinde görsel içindeki yüzleri tanıma, belirleme işlemini yapabilirim.

static readonly CascadeClassifier YuzBelirle = new CascadeClassifier("haarcascade_frontalface_alt_tree.xml");


Butonu bastığımda kameramı başlatıyorum.

        private void btnBaslat_Click(object sender, EventArgs e)
        {
            kameram = new VideoCaptureDevice(Cihazlar[cmbKamera.SelectedIndex].MonikerString);

            kameram.NewFrame += Device_NewFrame;
            kameram.Start();
        }

WEBcam’den yakaladığım görüntüyü Bitmap classından türettiğim gorsel nesnesine klonluyorum. Yüz algılandıktan sonra bir dizi dikdörtgen elde edilmesini sağlayacağım. Dikdörtgeni çizdirdikten sonra picturebox kontrolümde yüzün çevresinde göstereceğim. Akabinde dikdörtgeni Graphics classı ile çizdireceğim.

private void Device_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            Bitmap gorsel = (Bitmap)eventArgs.Frame.Clone();
            Image< Bgr,byte> goruntu = new Image< Bgr, byte> (gorsel);

            Rectangle[] cerceveler = YuzBelirle.DetectMultiScale(goruntu, 1.2, 1);


            foreach (Rectangle cerceve in cerceveler)
            {
                using (Graphics grafik = Graphics.FromImage(gorsel))
                {
                    using (Pen kalem = new Pen(Color.Red, 5))
                    {
                        grafik.DrawRectangle(kalem, cerceve);
                    }
                }
            }

            pictureBox1.Image = gorsel;

        }

Form kapanırken de kameramı kapatıyorum.

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (kameram.IsRunning)
            {
                kameram.Stop();
            }
        }


Tüm kodları bir arada verelim:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using AForge.Video;
using AForge.Video.DirectShow;
using Emgu.CV;
using Emgu.CV.Structure;

namespace WEBCam_KullanarakYuzBelirleme2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //FilterInfoCollection ve VideoCaptureDevice sınıfından nesnelerimi türettim. FilterInfoCollection cihazımdaki tüm kameraları, yakalama cihazlarını vs bulur. VideoCaptureDevice ise benim kullanacağım kamera için değişkenim olacak.
        FilterInfoCollection Cihazlar;
        VideoCaptureDevice kameram;


        //Projeme CascadeClassifier classını ekliyorum.Bu sınıftan türettiğim nesne sayesinde görsel içindeki yüzleri tanıma, belirleme işlemini yapabilirim.
        static readonly CascadeClassifier YuzBelirle = new CascadeClassifier("haarcascade_frontalface_alt_tree.xml");


        //Formun load olayında bilgisayarıma bağlı olan dahili ve harici kameraları tarıyorum ve comboboxa ekliyorum.
        private void Form1_Load(object sender, EventArgs e)
        {
            Cihazlar = new FilterInfoCollection(FilterCategory.VideoInputDevice);

            //FilterInfo cihazdaki görüntü yakalama cihazları hakkında bilgi tutar.
            foreach (FilterInfo cihaz in Cihazlar)
            {
                cmbKamera.Items.Add(cihaz.Name);
            }
            //İlk bulduğu kamera ismi görünsün diye ilk atamayı yaptık, 0 verdik.
            cmbKamera.SelectedIndex = 0;

            kameram = new VideoCaptureDevice();

        }

        //Butonu bastığımda kameramı başlatıyorum. 
        private void btnBaslat_Click(object sender, EventArgs e)
        {
            kameram = new VideoCaptureDevice(Cihazlar[cmbKamera.SelectedIndex].MonikerString);

            kameram.NewFrame += Device_NewFrame;
            kameram.Start();
        }

        private void Device_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            //WEBcam'den yakaladığım görüntüyü Bitmap classından türettiğim gorsel nesnesine klonluyorum.
            Bitmap gorsel = (Bitmap)eventArgs.Frame.Clone();

            //yüz algılandıktan sonra bir dizi dikdörtgen elde edilmesini sağlıyoruz. Dikdörtgeni çizdirdikten sonra picturebox kontrolümüzde yüzün çevresinde göstereceğiz.
            Image< Bgr,byte> goruntu = new Image< Bgr, byte> (gorsel);

            Rectangle[] cerceveler = YuzBelirle.DetectMultiScale(goruntu, 1.2, 1);

            foreach (Rectangle cerceve in cerceveler)
            {
                //Dikdörtgenimi çizdiriyorum.
                using (Graphics grafik = Graphics.FromImage(gorsel))
                {
                    using (Pen kalem = new Pen(Color.Red, 5))
                    {
                        grafik.DrawRectangle(kalem, cerceve);
                    }
                }
            }

            pictureBox1.Image = gorsel;

        }

        //Form kapanırken kameramı durduruyorum.
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (kameram.IsRunning)
            {
                kameram.Stop();
            }
        }
    }
}


Sonuca ilişkin bir örnek;

EMGU.CV Kullanarak WEBCam Üzerinden Yüz Belirleme Uygulaması

Şimdilik bu kadar 🙂

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir