Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

EmguCV – Multiple Face Recognition(Çoklu Yüz Tanıma)

Merhaba,

Görüntü işleme teknolojilerinde nesnelerin tanımlanması, hareketlerin algılanması yahut tüm bunların yanında psikolojik testler veya geleceğe dönük tahminsel oranların elde edilmesi mümkündür. Amma velakin nitelik olarak kompleks ihtiyaçlara giden bu süreç daha da kompleks çalışmalar gerektirmektedir. İşte bu bilinçle yola çıkarak bu içeriğimizde Çoklu Yüz Tanıma diye nitelendirdiğimiz Multiple Face Recognition teknolojisi üzerine konuşuyor, istişare ediyor ve teknik olarak ele alıyor olacağız.

Evet… Şimdi sizlerin eşliğinde bu makalede yazılımsal olarak yüz tanıma üzerine bir süreç geçireceğiz. Herşeyden önce yüz tanıma kavramı üzerinde biraz durup yapacağımız işi daha da netleştirecek, ardından nasıl bir yaklaşım ve algoritma sergileyeceğimiz üzerine istişare ederek son adımda konuyu teknik boyutta ele alıp makalemizi sonlandıracağız.

Öncelikle yüz tanımlama/algılama/bulma ile yüz tanıma arasındaki farkı çizmekte fayda var.

Yüz tanımlama, elimizdeki kaynak görüntü üzerinde yaptığımız tarama sonucu bir yüz ya da yüze benzer tüm ifadeleri algılayarak üzerinde işlem yapmaktır. Yani o yüzün kim olduğu, kime ait olduğu o anlık mevzu bahis değildir. Bu konu üzerinde yapmış olduğumuz önceki şu ve şu çalışmalarıma göz atabilirsiniz.

Yüz tanıma ise, kaynak üzerinde tespit edilen yüzün kime ait olduğunu bulabilmek yani adı üzerinde tanımaktır. Bu yüz, “Hilmi mi?”, “Rıfkı mı?”, “Ayşe mi?” yoksa “Muiddin abi mi?” vs. sorularının cevabını verebilmektir. Bu işlem için yüzün tanımlanması/algılanması/bulunması gereken ilk öncülken, ardından ikinci öncül bu yüzün kime ait olduğu üzerine yapılan çalışma gerçekleşerek tanıma aşaması söz konusu olmakla süreç işlemektedir.

Yüz tanımlama ile tanıma arasındaki farka değindikten sonra heyecanlı bir şekilde sorduğunuz Peki Nasıl Bir Algoritma İzleyeceğiz? sorunuzu duyar gibiyim…

Oo halde hadi gelin şimdide yaklaşımımız üzerine konuşuyor olalalım…

Nasıl Bir Yaklaşım? Nasıl Bir Algoritma?

İster yazılım olsun ister herhangi bir canlı farketmeksizin gördüğü birşeyi tanıması için o şeyi önceden tanımlamış olması gerekmektedir. Yani önceden o şeye bir isim, sıfat, değer yahut sembolik bir ifade vermiş olması gerekmektedir ki sonradan gördüğünde hafızasında o şeyle ilişkili ifade canlansın ve o ifadeyle o şeyi nitelendirebilsin…

Bir insan gördüğü herhangi bir masanın beynindeki masa şeması ile eşleşmesi ve o şemaya “masa” değerini vermesi sonucu ilgili nesneyi gördüğünde onu çok rahat bir şekilde tanımlayabilmesi ve tanıyabilmesi ve hatta tarif edebilmesi işte önceden o nesneyi hafızasına bir şekilde kaydetmesinden kaynaklanmaktadır. Aynı mantıkla bu başka bir insan içinde geçerlidir. Eğer ki ben müneccim değilsem eğer Muhiddin abiyi gördüğüm anda onun o iğrenç suratının beynimdeki şemayla uyması ve onun “Muhiddin” ismiyle tanımlanması neticesinde onu tanıyabiliyor ve gördüğüm zaman ondan kaçabiliyorum…

Her neyse…

İşte bir yazılımda söz konusu olduğunda tanıyacağı nesneyi mukayese edebilecek bir hafızaya sahip olması gerekmektedir. Yani yazılımın beni görüp, algılayıp, ‘aaAa bu Gençay değil mi layhn’ diyerek tanıyabilmesi için önceden hafızasında benimle ilgili verileri tutuyor olması gerekmektedir ki o verilerle mukayese sonucunda gördüğü şeyin ben olup olmama ihtimalini değerlendirebilsin.

Bu demek oluyor ki, yazılımın ha deyince Allah vergisi bir şekilde kişiyi görür görmez kimin Kamil kimin Coni, kimin Abdülrezak olduğunu bilmesi bir hayalden ibaretmiş.

Burada kişileri bizim yazılıma, onun anlayacağı bir dilde, uygun bir formatta tanıtmamız gerekmektedir. Aslında makalemizin ileriki satırlarında teknik olarak ele alacağız ama şimdiden bu konuya kısaca değinmekte fayda var. Yapacağımız işlem, yazılımın tanımasını istediğimiz kişilerin yüz profillerinden en az iki adet olmak üzere farklı açılardan alınmış görüntülerini bir xml formatında uygun şablonda tutmaktan ibarettir. Yazılım tanımladığı yüzleri bu xml veri kaynağındaki değerlerle kıyaslayarak o yüzün kime ait olduğunu %80’lik bir doğruluk payıyla bulabilecektir. Tabi burada ne kadar farklı açıdan resim olursa kişi üzerinde tahmin oranı artacak ve doğruluk payı yükselecektir.

Yüz tanıma işlemi için EmguCV’de(OpenCV’de de) Eigenfaces, Fisherfaces ve LBPH olmak üzere üç adet algoritma mevcuttur. Bu algoritmalar yukarıdaki paragrafta da bahsettiğim gibi hafızadaki görüntülerle o anki tanımlanan yüz arasındaki korelasyona bakarak tahmin işlevini gerçekleştirmektedirler. Ama burada terminolojik bir tezata düşmemek için düzeltmemiz gereken bir tarif vardır. Bu algoritmaların mukayese amaçlı kullanacağı yüz resimlerini bizler manuel olarak oluşturabilir ve xml formatına yazabiliriz. Ama bu işlem binlerce veri söz konusu olduğunda zahmetli olacağı için yazılıma yaptıracağız. İşte yazılımın kişilerin yüzlerini alıp, arka planda belirli bir hafızada depolamasına ve xml formatında bu resimleri organize etmesine “eğitim” denmektedir. Yani yazılımın yüzlere özel kendini eğitmesi söz konusu olacaktır.

Yukarıda bahsettiğimiz üç algoritmayı kısaca özetlemek gerekirse eğer;

  • Eigenfaces
    Hafızadaki tüm resimlerin ortalamasını alarak ortaya çıkan görüntünün ortalamadan farkını alır. Böylece her görüntü aslında bir diferansiyel görüntü gibi değerlendirilir.
  • Fisherfaces
    Eigenfaces’e nazaran daha da gelişmiş bir yüz tanıma algoritmasıdır. Bir kişiye ait birden fazla fotoğrafı bir sınıfın üyeleri olarak kabul edip sınıflar arası tanıma işlemi yapmaya dayanır.
  • LBPH
    Bir noktanın etrafındaki piksellerin yoğunluk değerlerine göre oluşan ikili(binary) örüntülerden yaratılır ve bu örüntüler üzerinde işlemler gerçekleştirerek nesneyi aramaktadır.

Şimdi sıra teknik olarak EmguCV ile yüz tanıma işlemini ele almaya geldi. Bu güne kadar bu konuda yapmış olduğum çalışmalar neticesinde Business Recognition ve Classifier Train olmak üzere iki sınıf inşa etmiş bulunmaktayım. Bunlardan Classifier Train isimli olan sınıfımız yüz eğitiminden ve yüz tanıma algoritmasından sorumlu bir sınıftır. Business Recognition sınıfı ise Classifiew Train sınıfını refere etmekte ve eğitim süreciyle birlikte diğer tüm durumları kontrol ettiğimiz sınıftır. Bu iki sınıfın benzerlerini internette görebilirsiniz. Lakin ben sınıfları dahada geliştirerek dizin ve dosya koordinasyonu yapabilir hale getirmiş bulunmaktayım.

Haliyle bir örnek proje üzerinde seyredeceğimiz için gerekli tüm EmguCV entegrasyonu ve alt yapı çalışmasını önceki makalelerimize istinaden sizlere bırakmakla beraber yukarıda paylaştığım sınıfları projenize import etmeyi unutmayınız. Ayriyetten yapmış olduğum çalışmayı makalenin sonunda paylaşacağımıda bildirmek isterim.

1. Adım

Yüzlere Yazılımın Eğitilmesi

Bu işlem için “Business Recognition” sınıfındaki “SaveTrainingData” metodunu kullanmaktayız.

public bool SaveTrainingData(Image face_data, string FaceName)
        {
            try
            {
                string NAME_PERSON = FaceName;
                Random rand = new Random();
                bool file_create = true;
                string facename = "face_" + NAME_PERSON + "_" + rand.Next().ToString() + ".jpg";
                while (file_create)
                {
                    if (!File.Exists(Dizin + facename))
                        file_create = false;
                    else
                        facename = "face_" + NAME_PERSON + "_" + rand.Next().ToString() + ".jpg";
                }
                if (Directory.Exists(Dizin))
                    face_data.Save(Dizin + facename, ImageFormat.Jpeg);
                else
                {
                    Directory.CreateDirectory(Dizin);
                    face_data.Save(Dizin + facename, ImageFormat.Jpeg);
                }
                if (File.Exists(Dizin + XmlVeriDosyasi))
                {
                    bool loading = true;
                    while (loading)
                    {
                        try
                        {
                            docu.Load(Dizin + XmlVeriDosyasi);
                            loading = false;
                        }
                        catch
                        {
                            docu = null;
                            docu = new XmlDocument();
                            Thread.Sleep(10);
                        }
                    }
                    XmlElement root = docu.DocumentElement;
                    XmlElement face_D = docu.CreateElement("FACE");
                    XmlElement name_D = docu.CreateElement("NAME");
                    XmlElement file_D = docu.CreateElement("FILE");
                    name_D.InnerText = NAME_PERSON;
                    file_D.InnerText = facename;
                    face_D.AppendChild(name_D);
                    face_D.AppendChild(file_D);
                    root.AppendChild(face_D);
                    docu.Save(Dizin + XmlVeriDosyasi);
                }
                else
                {
                    FileStream FS_Face = File.OpenWrite(Dizin + XmlVeriDosyasi);
                    using (XmlWriter writer = XmlWriter.Create(FS_Face))
                    {
                        writer.WriteStartDocument();
                        writer.WriteStartElement("Faces_For_Training");
                        writer.WriteStartElement("FACE");
                        writer.WriteElementString("NAME", NAME_PERSON);
                        writer.WriteElementString("FILE", facename);
                        writer.WriteEndElement();
                        writer.WriteEndElement();
                        writer.WriteEndDocument();
                    }
                    FS_Face.Close();
                }
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }

Bu metot tanımlanan yüzleri belirtilen kaynağa aktarma ve bunların yanında gerekli xml formatındaki veri setine ekleme görevinden sorumludur. Formumuzda bu işi yapmakla görevli olan olayımız ise aşağıdaki gibidir.

        private async void btnEgit_Click(object sender, EventArgs e)
        {
            await Task.Run(() =>
            {
                for (int i = 0; i < 10; i++)
                {
                    if (!recognition.SaveTrainingData(pictureBox2.Image, txtFaceName.Text)) MessageBox.Show("Hata", "Profil alınırken beklenmeyen bir hata oluştu.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    Thread.Sleep(100);
                    lblEgitilenAdet.Text = (i + 1) + " adet profil.";
                }
            });
            recognition = null;
            train = null;
            recognition = new BusinessRecognition("D:\\", "Faces", "yuz.xml");
            train = new Classifier_Train("D:\\", "Faces", "yuz.xml");
        }

Görüldüğü üzere tanımlanan yüzler pictureBox2 nesnesine atanmaktadır. Haliyle yakalanan bu yüz resimleri SaveTrainingData metoduna gönderilmekte ve program yüzlere özel eğitilmektedirler. Ayrıca, recognition ve train referansları global tanımlandıkları için yeri gelince paylaşılacaktır.

2. Adım

Eğitilen Yüzlerle Tanımlanan Yüzü Kıyaslama

Bu adımda devreye Classifier_Train sınıfının Recognise metodu girecektir.

        public string Recognise(Image<Gray, byte> Input_image, int Eigen_Thresh = -1)
        {
            if (_IsTrained)
            {
                EigenObjectRecognizer.RecognitionResult ER = recognizer.Recognize(Input_image);
                if (ER == null)
                {
                    Eigen_label = "Unknown";
                    Eigen_Distance = 0;
                    return Eigen_label;
                }
                else
                {
                    Eigen_label = ER.Label;
                    Eigen_Distance = ER.Distance;
                    if (Eigen_Thresh > -1) Eigen_threshold = Eigen_Thresh;
                    if (Eigen_Distance > Eigen_threshold) return Eigen_label;
                    else return "Unknown";
                }

            }
            else return "";
        }

Bu metot, gönderilen image nesnesini hafızadakilerle kıyaslayarak eşleşen kaydın bilgilerini dönmektedir.

3. Adım

Tanımlanan ve Tanınan Yüzün Vurgulanıp İsminin Yazılması

Artık sıra formun load eventında çalışmaya geldi. Burada kamera görüntüsü alma, yüz tanımlama ve vurgulama işlemlerinin yanında yüz tanıma algoritmalarını devreye sokacak tetiklemeler yapılmaktadır.

        BusinessRecognition recognition = new BusinessRecognition("D:\\", "Faces", "yuz.xml");
        Classifier_Train train = new Classifier_Train("D:\\", "Faces", "yuz.xml");
        private void Form1_Load(object sender, EventArgs e)
        {
            Capture capture = new Capture();
            capture.Start();
            capture.ImageGrabbed += (a, b) =>
            {
                var image = capture.RetrieveBgrFrame();
                var grayimage = image.Convert<Gray, byte>();
                HaarCascade haaryuz = new HaarCascade("haarcascade_frontalface_alt2.xml");
                MCvAvgComp[][] Yuzler = grayimage.DetectHaarCascade(haaryuz, 1.2, 5, HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(15, 15));
                MCvFont font = new MCvFont(FONT.CV_FONT_HERSHEY_COMPLEX, 0.5, 0.5);
                foreach (MCvAvgComp yuz in Yuzler[0])
                {
                    var sadeyuz = grayimage.Copy(yuz.rect).Convert<Gray, byte>().Resize(100, 100, INTER.CV_INTER_CUBIC);
                    //Resimler aynı boyutta olmalıdır. O yüzden Resize ile yeniden boyutlandırma yapılmıştır. Aksi taktirde Classifier_Train sınıfının 245. satırında hata alınacaktır.
                    pictureBox2.Image = sadeyuz.ToBitmap();
                    if (train.IsTrained)
                    {
                        string name = train.Recognise(sadeyuz);
                        int match_value = (int)train.Get_Eigen_Distance;
                        image.Draw(name + " ", ref font, new Point(yuz.rect.X - 2, yuz.rect.Y - 2), new Bgr(Color.LightGreen));
                    }
                    image.Draw(yuz.rect, new Bgr(Color.Red), 2);
                }
                pictureBox1.Image = image.ToBitmap();
            };
        }

Şimdi projemizi derleyip nasıl çalıştığına göz atalım.

Peder Beyle deneme yaperken 🙂

Peder Beyle ikinci denememiz 🙂

Örnek projeyi indirmek için buraya tıklayınız.

Okuduğunuz için teşekkür ederim…
Hepinize iyi çalışmalar, sonraki yazılarımda görüşmek dileğiyle…

Bunlar da hoşunuza gidebilir...

57 Cevaplar

  1. murat dedi ki:

    Gencay abi çalışman çok iyi olmuş kodları e-mailime atma şansın varmı.
    e-mail:muratbahar2732@outlook.com

  2. murat dedi ki:

    Çalılşmanız çok güzel olmuş elinize sağlık.Projeyi gönderirseniz memnun olurum
    e-mail:muratbahar2732@outlook.com

  3. Abdülkadir dedi ki:

    Kardeşim Ellerine Sağlık o kadar siteden aradım şöyle basit anlaşılır ve çalışanını bulamadım.Çok teşekkür ederim kodlarını projemde kullanacağım Hakkını Helal ET.

  4. cengiz dedi ki:

    Kardeşim projenin kodlarını bana da ulaştırabilir misin sorun değilse projem için bir kısmında yararlanmak isterimde e mail:cengiz.tr.oz@gmail.com

  5. ekin dedi ki:

    Eline sağlıkta, niye küçük paketi RAR dosyaya koyarsın.? zip dosyaya koy windows otomatik açsın. şimdi bide virus olma ihtimali olan rar açan yazılım yüklemek lazım.
    Yinede anlaşılır paylaşımın için teşekkür ederim, ama ben indirmedim.

  6. yusuf akgül dedi ki:

    Gencay bey ellerinize sağlık çok faydalı güzel bir çalışma olmuş.
    projeyi indirdim çalıştır dediğimde hata vermiyor hemen durduruyor sorun nedir acaba

  7. yusuf akgül dedi ki:

    Gencay bey
    Visual Studio üzerinde start ettiğim zaman hiç tepki vermeden ( HATA VERMEDEN ) program duruyor.. ancak bin->debug içerisindeki EXE çalışıyor…

  8. didem dedi ki:

    Gencay bey, çalışmalarınızı çok faydalı olmuş öncelikle teşekkür ederim. Bu yapmış olduklarınızı Asp.net web uygulaması içerisinde de yapabilir miyiz?

    • Gençay dedi ki:

      Merhaba Didem Hanım;

      Öncelikle nezaketiniz için bende teşekkür ederim.

      Sorunuza gelirsek eğer; bu çalışmayı direkt Asp.NET uygulaması olarak ayağa kaldıramazsınız. Mimarisel açıdan üzerinde çalışma yapmanız gerekecektir.

      İyi çalışmalar dilerim.

  9. Ahmet BGBRS dedi ki:

    Selamlar Gencay Bey. Öncelikle Çok ama Çok teşekkür ederim. Tüm interneti taradım böyle güzel anlatım görmedim. Emeğinize sağlık. projeyi çalıştırdım sorun yok. İki sorum olacaktı
    1. Ben Bilişim Öğretmeniyim Öğrencimle bitki tanıma ile ilgili proje yapıyoruz bu konuda yardımcı olursanız sevinirim.
    2. form’un load olayında açılır açılmaz tanımadığı yüz olsa bile ilk tanıdığı adı veriyor ordaki problemi nasıl giderebiliriz.

  10. Ahmet BAĞBARS dedi ki:

    Merhabalar Gencay Bey çalışmalarınız çok başarılı tebrik ederim. Ben Bilişim Öğretmeniyim öğrencilerimizle proje geliştiriyoruz. Bazı konularda yardımınızı rica edebilir miyim. E-Posta adresinizi alabilir miyim?

  11. Emirhan dedi ki:

    Valla abi ben 18 yaşında yım allahın izniyle yapay zeka projemi 2-3 yıla tamamlarım çok yararlı bir makale.

  12. Dehar dedi ki:

    Merhabalar Gencay Bey çalışmalarınız çok başarılı tebrik ederim.
    Emgu cv ile yüz tanıma sistemi yapmaktayım. Şöyle bir sıkıntım var yardımcı olabilir misiz ?
    Sisteme yeni yüz kaydı yapacağım zaman tanıtmadığım yüze en son kayıt ettiğim kişinin ismini veriyor. Tanınmamış kişide ismin olmamasını istiyorum. Ne yapmam gerekiyor?

  13. hakan dedi ki:

    tebrikler çok güzel bir çalışma devamını bekliyorum takipdeyim 🙂

  14. Baki dedi ki:

    Merhaba projede kullandığın xml dosyasını paylaşmanız mümkün mü acaba

  15. onurr dedi ki:

    hocam ben tüm yüzleri kadın-erkek olarak eğittim sadece cinsiyet belirliyorum. Birde ekranda görünen yüzlerin sayısını bastırmak istiyorum. Misal 2 erkek 3 kadın. Bu konuda yardımcı olabilir misiniz?

    • Gençay dedi ki:

      Ben vakitten dolayı olamam ama olanlar olabilir diye yorumunu paylaşıyorum 🙂

      • onurr dedi ki:

        Aslında pek vaktinizi alacağını sanmıyorum. Sizin kodunuzu kullanıyorum zaten. Aynı kodlara tekrar bakarsanız yardımcı olabilirsiniz diye düşünüyorum 🙂

        • Gençay dedi ki:

          Yakaladığın görüntülerin Count’ını alman gerekmektedir. Bu makaleyi yazalı yaklaşık 2 yıl oldu. Dolayısıyla oturup yakalanan görüntünün hangi koleksiyonda olduğuna göz atmam gerekecek. Bunu sende yapabilirsin. Elinde görüntüleri getiren bir koleksiyon olmalı. “.Count” işini görecektir.

  16. Gökhan Emre dedi ki:

    Eline sağlık Reis

  17. Akın dedi ki:

    İyi günler gencay bey. Yüz tanıma ve recognize emgucv ile ilgili ders veriyormusunuz eğer verirseniz asağıdaki eposta ile görşelim
    akindinc@gmail.com

  18. Akın dedi ki:
    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 System.IO;
    using Emgu.CV;
    using Emgu.CV.Structure;
    
    using System.Data.SQLite;
    using Emgu.CV.Face;
    
    
    namespace FaceRec_deneme1
    {
        public partial class Form1 : Form
        {
            CascadeClassifier facecascade = new CascadeClassifier("haarcascade_frontalface_default.xml");
            VideoCapture capture;
            FaceRecognizer lrecognizer;
            FaceRecognizer.PredictionResult lER;
            public static SQLiteConnection mycon;
            public static SQLiteCommand sc;
            public static SQLiteDataReader sr;
            Image theconverted_grayface = null;
            Image grayImage = null;
            Image currentFrame;
            int xfaceid = 0;
            bool hastrainedfaces = false;
            string xname;
            List lNames_List_ID = new List();
            List lNames_List = new List();
            List&lt;Image&gt; ltrainingImages = new List&lt;Image&gt;();
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                capture = new VideoCapture(0);
                capture.QueryFrame();
                Application.Idle += new EventHandler(FrameProcedure);
                button1.Enabled = false;
                Opendataface();
            }
    
            internal string Recognise(Image Input_image) ////&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;FACE RECOGNIZER HERE......... 
            {
                lER = lrecognizer.Predict(Input_image);
                if (lER.Label != -1) return lNames_List[lER.Label]; else return "Unknown";
            }
    
            private void FrameProcedure(object sender, EventArgs e)
            {
                var dstMat = new Mat();
                var Frame = capture.QueryFrame();
                CvInvoke.Resize(Frame, dstMat, new Size(420, 400), interpolation: Emgu.CV.CvEnum.Inter.Cubic);
                currentFrame = dstMat.ToImage();
                grayImage= currentFrame.Convert();
                if (currentFrame != null)
                {
                    Rectangle[] faceDetected = facecascade.DetectMultiScale(grayImage, 1.1, 5, Size.Empty, new Size(170, 170));
                    foreach (Rectangle faceFound in faceDetected)
                    {
                        load_AND_train_dataface();
                        if (hastrainedfaces)
                        {
                            //Trained........Face Recognizer here...............FACE RECOGNITION BEGINS HERE...
                            xname = Recognise(theconverted_grayface);
                            if (xname != "Unknown")
                            {
                                currentFrame.Draw(faceFound, new Bgr(Color.Green), 3);
                            }
                            else
                            {
                                currentFrame.Draw(faceFound, new Bgr(Color.Red), 3);
                            }
                        }
                        //currentFrame.Draw(faceFound, new Bgr(Color.Red), 2);
                        theconverted_grayface = currentFrame.Copy(faceFound).Resize(100, 100, Emgu.CV.CvEnum.Inter.Cubic).Convert();
                    }
                }
                pictureBox1.Image = currentFrame.ToBitmap();
            }
    
            private void Opendataface()
            {
                string ConnStr = "Data source =dataface.db"; //debug içindeki dbornek dosyasına ulaşır
                mycon = new SQLiteConnection(ConnStr);
                mycon.Open();
            }
    
            private void savetodataface(Image grayface)
            {
                pictureBox2.Image = grayface.ToBitmap();
                Bitmap faceimage = grayface.ToBitmap();
                var largememimage = new MemoryStream();
                faceimage.Save(largememimage, System.Drawing.Imaging.ImageFormat.Jpeg);
                byte[] limage = largememimage.ToArray();
                string sql = "insert into ftable(name,face) values(@name,@face)";
                sc = new SQLiteCommand(sql, mycon);
                sc.Parameters.AddWithValue("@name", txtname.Text);
                sc.Parameters.AddWithValue("@face", limage);
                sc.ExecuteNonQuery();
    
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                savetodataface(theconverted_grayface);
            }
    
            private void load_AND_train_dataface() ///LOADING.... DATA FACESSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
            {
                string ss = "select name,face from ftable";
                sc = new SQLiteCommand(ss, mycon);
                sr = sc.ExecuteReader();
                if (sr.HasRows == true)
                {
                    while (sr.Read())
                    {
                        lNames_List_ID.Add(xfaceid);
                        lNames_List.Add(sr.GetString(0));
                        ltrainingImages.Add(new Image((Bitmap)Image.FromStream(new MemoryStream((System.Byte[])sr["face"]))));
                        xfaceid++;
                    }
                }
                sr.Dispose();
                sc.Dispose();
                if (xfaceid == 0) return;
    
                lrecognizer = new EigenFaceRecognizer(xfaceid, 2000);
                lrecognizer.Train(ltrainingImages.ToArray(),hastrainedfaces=true);//BU KISIMDA HATA VERİYOR. ÇÖZEMEDİM
            }
        }
    }
    

    GENCAY BEY YUKARIDAKİ EN SON YAPIYI EKLEDİĞİMDE HATA VERİYOR.
    private void load_AND_train_dataface() YAPISINI EKLEYENE KADAR YÜZ BULUYOR.SQL KISMINA EKLİYOR AMA SON KISMI EKLEYİNCE HATA VERİYOR.

  19. göksel dedi ki:

    var grayimage = image.Convert();

    bu satırda hata alıyorum.
    nesne başvurusu bir nesnenin örneğine atanmadı.
    neden olabilir. sizin örnek proje ile bu hatayı alıyorum.

    • YILDIRIM dedi ki:

      aynı hatayı bende alıyorum “Nesne başvurusu bir nesnenin örneğine ayarlanmadı” “image was null”

  20. göksel dedi ki:

    ” var grayimage = image.Convert(); ” küçük büyük karakteri arasındaki kısım burada çıkmıyor…

  21. Resul dedi ki:

    merhabalar paylaşım için teşekkür ederim. İlk yüzü hafızaya kayıt edince , aynı yüzü görünce isim yazıyor ama farklı bir yüz gelince onuda ilk yüzün adı ile etiketliyor sorun nerede olabilir acaba.

  22. Resul dedi ki:

    Birde ilk yüzün 10 adet profilini pc ye kayıt ediyor ama 2. yüzü eğit dediğimde ilk yüzü kayıt ettiği yerde 2. yüzün 10 adet profili gözükmüyor sorun burada olabilir mi ? Şimdiden teşekkür ederim.

  23. Resul dedi ki:

    hata düzeldi gibi anlam veremedim

  24. Adem ÇİCEK dedi ki:

    Gencay bey merhabalar. Benim vesikalıktan kişinin geçtiği resimleri bulabileceğim bir kütüphaneye ihtiyacım var. Bu emgucv ile bu işlemi hızlı bir şekilde yapabilirmiyim veya alternatif kütüphaneler(ücretli ya da ücretsiz) varmıdır. Bereden başlayabilirim. yardımcı olabilirmisiniz. Şİmdiden teşekürler

    • Gençay dedi ki:

      Merhaba,

      Bu işlemi EmguCV ile bu içerikte bahsettiğimiz yöntem üzerinden hızlıca geliştirebilir ve kullanabilirsiniz. Bu içerik yazılalı iki yılı geçtiğinden dolayı EmguCV’nin üç aşağı beş yukarı değişikliğe uğramış olması muhtemeldir. Tabi isterseniz Accord.NET yahut OpenCV kütüphanelerinide araştırabilirsiniz.

      Kolay gelsin.

      • Adem ÇİCEK dedi ki:

        Gencay bey merhabalar.emgucv ile kapı giriş sistemine yakın bir sistemi çalışır hale getirdim. kişiyi kayıt yapıyoruz ve sonrasında sisteme girişini kameradan aldığımız görüntü ile kayıtlı resmi karşılaştırıp login işlemini gerçekleştiriyorum. benim yapmak istediğim ise arşiv taraması yapmak. burada nasıl bir yol izleyeceğim biraz yol gösterebilir misiniz.

        • Gençay dedi ki:

          Merhaba,

          Burada anlatılan Face Recognition işlemini fonksiyonel hale getirip, elde edilen yüz resmini bu fonksiyon aracılığıyla arşivdekilerle kıyaslayıp, tarayabilirsiniz.

  25. Resul dedi ki:

    hocam lütfen yardım. Kayıt etmediğim kişi tanımsız olarak algınaması lazım. kendi resmimi tanıtınca adımı gösteriyor ama oğlumun resmini hiç tanıtmıyorum onuda benim adımla gösteriyor.
    Yazılımda if( train.IsTrained) anladığım kadarıyla eğitilmiş resim olup olmadığına bakıyor . Sadece kendi fotomu eğitsem bile oğlumun fotosunda tanımsız yazması lazımken benim adımı yazıyor.
    yani bu if( train.IsTrained) sorgulamasında sadece eğilmiş yüz olup olmadığına değilde eğitilen foto ile ana ekranda çıkan fotoyu nasıl kıyaslama yapacaz.

  26. ozan dedi ki:

    abi bu tanıtma işini yüz dışında şeylerede yapabilirmiyiz

  27. Alper dedi ki:

    DllNotFoundException: DLL ‘opencv_core2410’ yüklenemedi: Belirtilen modül bulunamadı. (HRESULT özel durum döndürdü: 0x8007007E) bu hatayı alıyorum nedeni ne olabilir capture kısmında

  28. Enes dedi ki:

    Merhabalar Gencay Bey, bahsettiğiniz 3 algoritmadan hiçbirini kullanmadan mı bu projeyi yaptınız?

    • Gençay dedi ki:

      Merhaba,

      Bu algoritmaları kullanabilmek için işin matematiğine hakim olman gerekiyor. Sen olma diye OpenCV, EmguCV kütüphaneleri oluşturulmuştur. Bu kütüphaneleri kullanarak direkt operasyonları sağlayabilirsiniz.

  29. Enes dedi ki:

    Gencay bey test data’yı random mu seçiyor .

  30. mÇınar dedi ki:

    Capture capture = new Capture(); hatası alıyorum buranın altını çiziyor o yüzden program çalışmıyor yardım eder misiniz ? proje için çalışıyorum bu hatanın sebebi nedir???

  31. recep dedi ki:

    Merhaba Gencay Bey
    Kamera kısmına IP kamera nasıl ekleriz.

  32. yasin dedi ki:

    Kameranın önunden gencay 10 defa geçti diyelim labele bu sayıyı nasıl yazdırırız

  33. Hüsnü dedi ki:

    Hocam iyi günler, aynı projede sorguyu dosyadan değil de sql den yaptırmak istesek nasıl bir yol izlemeliyiz.

  34. Murat Şenel dedi ki:

    hocam typeinizitionexception hatası alıyorum copy to always yaptım ama olmadı neden bu hatayı alıyorum sinir etti 2 gündür yardımcı olabilirseniz sevinirim.allaha emanet olun.

    System.TypeInitializationException was unhandled
      Message='OpenCvSharp.CvInvoke' tür başlatıcısı özel durum döndürdü.
      Source=OpenCvSharp
      TypeName=OpenCvSharp.CvInvoke
      StackTrace:
           konum: OpenCvSharp.CvInvoke.cvLoadImage(String filename, LoadMode flags)
           konum: OpenCvSharp.IplImage..ctor(String filename, LoadMode flags)
           konum: OposSharp.Opos.LoadImage(String fname) C:\Plaka Tanıma Sistemleri\OposSharp\OposSharp\Opos.cs içinde: satır 51
           konum: OposSharp.Form1.button1_Click(Object sender, EventArgs e) C:\Plaka Tanıma Sistemleri\OposSharp\OposSharp\Form1.cs içinde: satır 31
           konum: System.Windows.Forms.Control.OnClick(EventArgs e)
           konum: System.Windows.Forms.Button.OnClick(EventArgs e)
           konum: System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
           konum: System.Windows.Forms.Control.WmMouseUp(Message&amp; m, MouseButtons button, Int32 clicks)
           konum: System.Windows.Forms.Control.WndProc(Message&amp; m)
           konum: System.Windows.Forms.ButtonBase.WndProc(Message&amp; m)
           konum: System.Windows.Forms.Button.WndProc(Message&amp; m)
           konum: System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&amp; m)
           konum: System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&amp; m)
           konum: System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
           konum: System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG&amp; msg)
           konum: System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
           konum: System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
           konum: System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
           konum: System.Windows.Forms.Application.Run(Form mainForm)
           konum: OposSharp.Program.Main() C:\Plaka Tanıma Sistemleri\OposSharp\OposSharp\Program.cs içinde: satır 18
           konum: System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
           konum: System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
           konum: Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
           konum: System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           konum: System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           konum: System.Threading.ThreadHelper.ThreadStart()
      InnerException: System.DllNotFoundException
           Message=DLL 'cxcore200' yüklenemedi: Belirtilen modül bulunamadı. (HRESULT özel durum döndürdü: 0x8007007E)
           Source=OpenCvSharp
           TypeName=""
           StackTrace:
                konum: OpenCvSharp.Utilities.PInvokeHelper.DllImportError(Exception e)
                konum: OpenCvSharp.Utilities.PInvokeHelper.TryPInvoke()
                konum: OpenCvSharp.CvInvoke..cctor()
           InnerException:
    

Gençay için bir yanıt yazın Yanıtı iptal et

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir