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\
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.
Not: .Net 4.6.1 de gelistirdim. Kullandigim EmguCV nuget versiyonu 3.1.0.1 dir
2016 : memet tayanç