Image
Kasım 05 2016 14:53

OpenCv 3.1, EmguCv 3.1 ile Yüz Tarama

 

              Okuldaki  derslerimden biride "Bilgisayarli görüde iler konular" evet ders adının pek karizmatik olmadigini biliyorum ama bekleyin ingilizcesi çok daha karizmatik "Computer Vision"...  Söyle 1-2 saniye durup "himm" hatta "waaayy" dedikten sonra devam edebiliriz.  Bu karizmatik ismi olan ders temel anlamda insanin görme, gördüklerini yorumlama, depolama, hesaplama, işleme vs. yeteneklerinin bilgisayarlara kazandirilmasi olarak tanimlanabilir.

Computer Vision'un alt processlerinden biride "Görüntü işleme"dir. Dersin içerigini biraz daha arastirıp bu konuda daha çok bilgi sahibi olmak amaciyla nette biraz zaman harcadim ve bu işlemi yapan kütüphanelere baktim. En nihayetinde, OpenCV uzun adiyla "Open Source Computer Vision"  üzerinde durmaya karar verdim. Peki neden alternatif görüntü isleme kütüphanelerinden biri degilde OpenCv derseniz. Matlap, OpeFrameworks, Halcon, CIMG, Fiji bunlarda varmis. Tabii benim daha önce hiçbiri ile tesriki mesaim olmadi bilmiyorum. Sadece Matlab’in adini duymuslugum var.  

Bu open source toolun c# için wrapper-larının olması ve çok popüler olması mı ilgimi çekti bilemiyorum. OpenCv nin .net ve bazi diger platformlar için gelistirilmis olan 2 popüler kütüphanesi var birincisi EmguCv su anda nuget üzerinde 3.1.0.1 versiyonu bulunmakta. Ikincisi ise OpenCVSharp bununda nuget üzerine 3.1.0.20161105 versiyonu bulunmakta…

OpenCV hakkinda biraz arastirma yaptiktan sonra EmguCV ile örnek bir uygulama, Yüz tarama uygulamasinin örnek kodlarini aramaya basladim. Genelde C++ ya da python örneklerine rastladim. Bunlarin çogu emgucv kütüphanesinin eski versiyonlarina aittiler ve nugette bulunan versiyon ile aralarinda pek çok fark bulunmaktaydi.

İnsanların  C# ve EmguCV ile basit bir yüz tanima uygulamasi örnegi için nette köse bucak dolasmamalari için bu makaleyi yaziyorum.  

Kodlamaya geçecek olursak.

Yüz ve göz tanima için kullandigi Xml dosyalarinin path-lerinin kod tarafında set ediliyor. Bu Xml dosyalari, Emgu yu kurdugunuz dizinde \Emgu\opencv\data\haarcascades\ altinda bulunmaktadir. 
Eger OpenCv yi makinenize indirmis ve onun kendi kütüphanesindeki xml leri kullanmak isterseniz xml leri bulacaginiz path : \opencv\sources\data\haarcascades\

 opencv

Resim  seçilmesi ile ilgili kod asagidadir. Bildiğimiz OpenFileDialog...

private void btnImage_Click(object sender, EventArgs e)
{
    using (var fd = new OpenFileDialog())
    {
        fd.Filter = @"Image Files|*.jpg;*.jpeg;*.png;*.gif;*.tif;";
        var file = fd.ShowDialog();
        var fileName = fd.FileName;

        if (file != DialogResult.OK || string.IsNullOrEmpty(fileName)) return;

        txtImage.Text = fileName;
        LoadAndProcessImage();
    }
}

Geçerli formatta bir resim seçildiğinde  EmguCV kütüphanesi DetectMultiScale e parametre olarak verdiğimiz sayı kadar komsu pixel taramasi ile beraber çalismaktadir. 
 

private void LoadAndProcessImage()
{
    var faceXmlFile = @"C:\Emgu\opencv\data\haarcascades\haarcascade_frontalface_default.xml";
    var eyeXmlFile = @"C:\Emgu\opencv\data\haarcascades\haarcascade_eye.xml";


    var imgOriginal = new Image<Bgr, byte>(txtImage.Text);

    var imgGray = imgOriginal.Convert<Gray, byte>();
    var hcFaceDetector = new CascadeClassifier(faceXmlFile);
    var hcEyeDetector = new CascadeClassifier(eyeXmlFile);

    image1.Image = null;

    var acFaces = hcFaceDetector.DetectMultiScale(imgGray, 1.1, 10, Size.Empty);
    var acEyes = hcEyeDetector.DetectMultiScale(imgGray, 1.1, 25, Size.Empty);
            
    foreach (var rectangle in acFaces)
    {
        imgOriginal.Draw(rectangle, new Bgr(Color.Red), 3);
    }

    foreach (var rectangle in acEyes)
    {
        imgOriginal.Draw(rectangle, new Bgr(Color.Blue), 3);
    }
    image1.Image = imgOriginal;
}

Evet artik resim taranmis ve resimde yüz bulundu ise resim üzerine islerenek asagidaki gibi bir görüntü çikmis olmalidir.

 opencv

Not: .Net 4.6.1 de gelistirdim. Kullandigim EmguCV nuget versiyonu 3.1.0.1 dir

 

2016 : memet tayanç