EMGU.CV Kullanarak Görsel Üzerinden Yüz Belirleme Uygulaması

Bu yazımızda EMGU.CV wrapper bir başka deyişle EMGU.CV kütüphanesini kullanarak, görsel bir fotoğraf üzerinden yüz belirleme uygulaması gerçekleştirelim. Yüz belirleme diyorum, çünkü amacım görselde görünen 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 görsel ü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 aslında facebook ve instagram uygulamalarında fotoğraflarda kişileri tanıma uygulamasının sadece yüz belirleme kısmı yani.

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 Görsel Ü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 Görsel Üzerinden Yüz Belirleme Uygulaması

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

EMGU.CV Kullanarak Görsel Ü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ıyorum ve Rebuild seçiyorum.

EMGU.CV Kullanarak Görsel Üzerinden Yüz Belirleme Uygulaması

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

EMGU.CV Kullanarak Görsel Ü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 soluiton 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 Görsel Ü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 Görsel Üzerinden Yüz Belirleme Uygulaması

Şimdi formuma bir adet picturebox ve bir adet buton ekliyorum. İsimlendirme yapmadım, zaten fazla kontrolüm yok. PictureBox BorderStyle özelliğini Fixed 3D yaptım. Diğer kısımlar tamamen görsel değişiklikler.

EMGU.CV Kullanarak Görsel Üzerinden Yüz Belirleme Uygulaması

Şimdi kodlarımıza dönebiliriz;

EMGU.CV Kullanarak Görsel Üzerinden Yüz Belirleme Uygulaması Kodlar:

Kütüphane kısmıma Emgu.CV ve Emgu.CV.Structure ekliyorum.

using Emgu.CV;
using Emgu.CV.Structure;


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 NesneBelirle = new CascadeClassifier("haarcascade_frontalface_alt_tree.xml");

Şimdi yüzleri bul butonuna bastığmda bir open file dialog penceresi açılacak. Seçmiş olduğum görseldeki yüzleri tarayıp, bu veriyi Bitmap classından türettiğim bir nesne içine atacağım. Yüz belirleme işlemi bittiğinde, yüzü bir dikdörtgen çerçeve içine alacağım. Bunun için de programda bir dikdörtgen çizdirip, picturebox üzerinde görüntülenen görsel üzerinde yüzü çerçevelemesini sağlayacağım.

Artık kodlara geçelim. Kodlarım içinde de açıklamalarım mevcut.

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 Emgu.CV;
using Emgu.CV.Structure;

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

        //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 NesneBelirle = new CascadeClassifier("haarcascade_frontalface_alt_tree.xml");

        private void button1_Click(object sender, EventArgs e)
        {
            //Butona bastığımda open file dialog penceresinin açılmasını sağlıyorum. Burada çoklu seçime izin vermedim. Filtreleme kısmında da JPEG ve jpg dosyalarını filtreledim.
            using (OpenFileDialog ofd = new OpenFileDialog() { Multiselect = false, Filter = "*.JPEG | *.jpg" })
            {

                //Eğer bir dosya seçilmiş ise bu dosyayı pictureboxa ekliyorum. Pictureboxa eklediğim görseli Bitmap sınfından türettiğim nesnenin içine atıyorum.
                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    pictureBox1.Image = Image.FromFile(ofd.FileName);
                    Bitmap gorsel = new Bitmap(pictureBox1.Image);

                    //Görselin dönüşüm işlemini (byte) yapıyorum.
                    Image< Bgr, byte> goruntu = new Image< Bgr, byte>(gorsel);

                    //Dikdörtgen sınıfından neste türetiyorum
                    Rectangle[] cerceveler = NesneBelirle.DetectMultiScale(goruntu, 1.4, 0);

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

                }
            }
        }
    }
}

Yüzde yüz başarılı olmasa da oldukça başarılı bir şekilde yüzleri bulabiliyorum. Tabi yüklenen görselin büyüklüğü, kişinin objektife bakması, yüklenen görselin kalitesi, kişilerin yüzlerinin belirginliği de performansı o derece etkiliyor. Yüzde yüz başarılı bir örnekte, yüzde 91 başarılı bir örneği de aşağıda paylaştım.

EMGU.CV Kullanarak Görsel Üzerinden Yüz Belirleme Uygulaması
EMGU.CV Kullanarak Görsel Üzerinden Yüz Belirleme Uygulaması
EMGU.CV Kullanarak Görsel Ü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