EmguCV – Algılanan Yüzün Resimden Çıkartılması

Merhaba,

Kâh kameradan kâh herhangi bir fotoğraf yahut resimden olsun farketmeksizin üzerinde görüntü işleme çalışması yaptığımız herhangi bir uygulamada, algılanan görüntüyü bütünden çıkarmayı isteyebiliriz. Yani görüntüyü kesip elde etmeyi isteyebiliriz. İşte bu içeriğimizde örnek olarak face detection/yüz algılama işlemi neticesinde, algılanan yüzleri ana resimden çıkaracak ve sadece ilgili objeyi elde edeceğiz.

Peki bu işlemi nasıl yapacağız?
Aslında yapacağımız işlem çokta şaşalı bir uğraş gerektirmemektedir. EmguCV sınıflarını kullanarak elde ettiğimiz yüzün zaten Rectangle bilgilerini elde edebilmekteyiz. Eee ayrıştırılacak olan parçanın koordinat bilgileri ve yükseklik/genişlik ölçüleri belirli olacağından geriye o ilgili parçayı resimden kesmek kalmaktadır.

Tabi bu işlemi yaparken kamera üzerinde çalışacağımız için kullanacağımız teknolojiler; kameradan görüntü elde etme ve bu görüntüler üzerinde gerekli face detection işlemlerini EmguCV ile gerçekleştireceğiz. Lakin kesilmesi gereken parçayı ise AForge.NET frameworkünü kullanarak elde edeceğiz.

Yani uzun lafın kısası olay bir kesme işleminden ibaret olacaktır.

Asıl konumuza girmeden hemen şurada kesme konusunda bir ısınma turu yapabiliriz.

EmguCV - Algılanan Yüzün Resimden Çıkartılması

Rıfkı Abi

Sizi yukarıdaki Rıfkı Abiyle tanıştırayım. Varsayalım ki bizler burada Rıfkı Abinin kafasını kesip elde etmeye çalışalım…

            Bitmap RifkiAbi = new Bitmap("rifkiabi.PNG");
            //Rectangle koordinatlarını deneme yanılma ile buldum :]
            Rectangle KafaKodlari = new Rectangle(60, 100, 100, 190);
            AForge.Imaging.Filters.Crop Kes = new AForge.Imaging.Filters.Crop(KafaKodlari);
            Bitmap RifkiAbiKafa = Kes.Apply(RifkiAbi);
            pictureBox1.Image = RifkiAbi;
            pictureBox2.Image = RifkiAbiKafa;

İşte bu kadar basit. Gördüğünüz üzere elimizde hali hazırda bir resim ve o resimde kesilecek alanın Rectangle koordinatları bulunması bizim için amacımız doğrultusunda tam tamına yeterlidir. Dikkat ederseniz resmimiz static olduğu için sadece AForge.NET kütüphanesindeki Crop sınıfını kullanmam yeterli olmuştur. Ama biz kameradan elde edilen birden çok görüntü üzerinde hem yüz algılayıp hemde algılanan yüz üzerinde bir kesim işlemi yapacağımız için EmguCV ile AForge.NET’i bir bütün olarak kullanacağız. Yukarı satırlarda da bahsettiğim gibi EmguCV gerekli kamera görüntüsünü elde edip, o görüntü üzerinde gerekli face datection işlemlerini gerçekleştirecek ve algıladığı yüzün Rectangle koordinatlarıyla beraber ilgili resmi bize getirecektir. Gerisi yukarıdaki kod bloğunda yapmış olduğumuz işlemle birebir aynıdır diyebilirim. Devreye AForge.NET girecek, ilgili yüzü Rectangle koordinatları aracılığıyla kesecek ve bize sunacaktır.

Haa bu arada Rıfkı Abinin son halini merak ediyorsanız aşağıdaki ekran görüntüsüne bakabilirsiniz.
EmguCV - Algılanan Yüzün Resimden Çıkartılması

Velhasıl şimdi asıl konumuzu inşa ederek üzerine yoğunlaşabiliriz. Önceki yazılarımda EmguCV ile kameradan nasıl görüntü alındığını ve yüzün nasıl algılandığını ele almıştım. O yüzden hiç hız kaybetmeden bu konuların anlatımını es geçip yapının inşasına giriyorum.

        private void Form1_Load(object sender, EventArgs e)
        {
            Capture capture = new Capture();
            capture.Start();

            HaarCascade haaryuz = new HaarCascade("haarcascade_frontalface_default.xml");

            capture.ImageGrabbed += (x, y) =>
            {
                var image = capture.RetrieveBgrFrame();
                if (image != null)
                {
                    var grayimage = image.Convert<Gray, byte>();

                    MCvAvgComp[][] Yuzler = grayimage.DetectHaarCascade(haaryuz, 1.2, 5, HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(15, 15));

                    foreach (MCvAvgComp yuz in Yuzler[0])
                    {
                        /*
                            --- Burada İşlem Yapacağız ---
                            Elde edilen o anki yüzün/yüzlerin
                            Rectangle koordinatları ve ilgili
                            ana resim burada elimizde mevcuttur.
                         
                         */

                        //Yüzü Vurguluyorum
                        Graphics g = Graphics.FromImage(image.Bitmap);
                        g.DrawEllipse(new Pen(Color.Gray, 3), yuz.rect);
                        MCvFont font = new MCvFont(FONT.CV_FONT_HERSHEY_COMPLEX, 0.3, 0.3);
                        //Yazı Yazıyorum
                        image.Draw("Yuz", ref font, new Point(yuz.rect.X + 10, yuz.rect.Y + 20), new Bgr(Color.Yellow));
                    }
                }
                pictureBox1.Image = image.ToBitmap();
            };
        }

Yukarıdaki kod bloğuna bakarsanız eğer açıklama satırıyla genişçe — Burada İşlem Yapacağız — şeklinde ifade de bulunduğum alanda çalışmamızı gerçekleştireceğiz.

        private void Form1_Load(object sender, EventArgs e)
        {
            Capture capture = new Capture();
            capture.Start();

            HaarCascade haaryuz = new HaarCascade("haarcascade_frontalface_default.xml");

            capture.ImageGrabbed += (x, y) =>
            {
                var image = capture.RetrieveBgrFrame();
                if (image != null)
                {
                    var grayimage = image.Convert<Gray, byte>();

                    MCvAvgComp[][] Yuzler = grayimage.DetectHaarCascade(haaryuz, 1.2, 5, HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(15, 15));

                    foreach (MCvAvgComp yuz in Yuzler[0])
                    {
                        //Gerekli Görüntüyü Kesiyoruz.
                        AForge.Imaging.Filters.Crop Kes = new AForge.Imaging.Filters.Crop(yuz.rect);
                        Bitmap YuzResmi = Kes.Apply(image.Bitmap);
                        pictureBox2.Image = YuzResmi;

                        //Yüzü Vurguluyorum
                        Graphics g = Graphics.FromImage(image.Bitmap);
                        g.DrawEllipse(new Pen(Color.Gray, 3), yuz.rect);
                        MCvFont font = new MCvFont(FONT.CV_FONT_HERSHEY_COMPLEX, 0.3, 0.3);
                        //Yazı Yazıyorum
                        image.Draw("Yuz", ref font, new Point(yuz.rect.X + 10, yuz.rect.Y + 20), new Bgr(Color.Yellow));
                    }
                }
                pictureBox1.Image = image.ToBitmap();
            };
        }

İşte bu kadar…

Aslında bu noktadan sonra gayemize ermiş bulunmaktayız lakin ben biraz daha gelişmiş/kompleks bir çalışmayı sizlerle paylaşmadan makalemizi sonlandırmayacağım.

        private void Form1_Load(object sender, EventArgs e)
        {
            Capture capture = new Capture();
            capture.Start();

            HaarCascade haaryuz = new HaarCascade("haarcascade_frontalface_default.xml");

            int Sayac = 1;
            capture.ImageGrabbed += (x, y) =>
            {
                var image = capture.RetrieveBgrFrame();
                if (image != null)
                {
                    var grayimage = image.Convert<Gray, byte>();

                    MCvAvgComp[][] Yuzler = grayimage.DetectHaarCascade(haaryuz, 1.2, 5, HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(15, 15));

                    foreach (MCvAvgComp yuz in Yuzler[0])
                    {
                        AForge.Imaging.Filters.Crop Kes = new AForge.Imaging.Filters.Crop(yuz.rect);
                        Bitmap YuzResmi = Kes.Apply(image.Bitmap);

                        if (Sayac != 7)
                        {
                            foreach (var nesne in Controls)
                            {
                                if (nesne is PictureBox pb)
                                    if (pb.Name == "p" + Sayac)
                                    {
                                        pb.Image = YuzResmi;
                                        Sayac++;
                                    }
                            }
                        }
                        else
                            Sayac = 1;

                        //Yüzü Vurguluyorum
                        Graphics g = Graphics.FromImage(image.Bitmap);
                        g.DrawArc(new Pen(Color.Green, 3), yuz.rect, -30, 240);
                        MCvFont font = new MCvFont(FONT.CV_FONT_HERSHEY_COMPLEX, 0.3, 0.3);
                        //Yazı Yazıyorum
                        image.Draw("Yuz", ref font, new Point(yuz.rect.X + 10, yuz.rect.Y + 20), new Bgr(Color.Yellow));
                    }
                }
                pictureBox1.Image = image.ToBitmap();
            };
        }

Evet… Yukarıda gördüğünüz gibi kameranın her karesinde algılanan nesneleri yukarıdaki gibi seri bir şekilde elde edebiliriz. Bu ve buna benzer birçok uygulamayı güvenlik, kontrol, denetim, analiz, tanımlama, tanıma vs. gibi birçok farklı alanda kullanabiliriz.

Son olarak ilk projeyi buradan, ikinci projeyide
buradan indirebilirsiniz.

Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

Bir Cevap Yazın

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

CAPTCHA (Şahıs Denetim Kodu) Resmi

*

Copy Protected by Chetan's WP-Copyprotect.