AForge.NET İle Hareket Algılama ve İşleme Algoritmaları

Merhaba,

Bu içeriğimizde AForge.NET kütüphanelerini kullanarak kendi küçük savunma sanayimizin inşasına ilk adımımızı atacağız 🙂 Hiç öyle uçan kaçan birşeye ihtiyacımız yok. Bir adet bilgisayar ve bir adet dahili yahut harici kamera sayesinde elde ettiğimiz görüntüler üzerinde hareketleri algıyacak, hareket unsurlarını farklı algoritmalar eşliğinde algılayarak vurgulayacak, tüm bunların yanında hareketin algılandığı herhangi bir anda istediğimiz işlemleri(örn; mail ya da mesaj gönderme) devreye sokabileceğiz. Hadi buyrun hiç vakit kaybetmeden çalışmamıza başlayalım.

Çalışmaya eşlik etmek istiyorsanız eğer bir adet Windows Form projesi oluşturarak formun üzerinde halihazırda bir adet PictureBox nesnesi tanımlamanız yeterli olacaktır.

Hatırlayalım  💡 
Herşeyden önce ilgili projemize AForge.NET kütüphanelerini entegre etmeyi unutmuyoruz.

Öncelikle, hareketleri algılayabilmek için sistemdeki kameralara erişerek görüntüleri elde etmemiz gerekmektedir. O yüzden hareket algoritmalarına gelmeden önce hangi kamera üzerinde çalışacağımızı belirlememiz gerekmektedir.

        public void KameralariGetir()
        {
            VideoCaptureDevice FinalVideoSource;
            FilterInfoCollection VideoCaptuerDevices;
            VideoCaptuerDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            FinalVideoSource = new VideoCaptureDevice(VideoCaptuerDevices[0].MonikerString);
            FinalVideoSource.NewFrame += FinalVideoSource_NewFrame;
            FinalVideoSource.DesiredFrameRate = 500;
            FinalVideoSource.DesiredFrameSize = new Size(1, 500);
            FinalVideoSource.Start();
        }
        private void FinalVideoSource_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
        {
            Bitmap image = (Bitmap)eventArgs.Frame.Clone();
            pictureBox1.Image = image;
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            KameralariGetir();
        }

Yukarıdaki yapmış olduğumuz çalışma neticesinde sistemdeki kameraları elde ederek çalışacağımız kamerayı belirlemiş ve kameradan elde edilen görüntüleri PictureBox nesnesine anlık olarak göndermiş bulunmaktayız.

Evet… Şimdi kameradan elde edilen görüntüler üzerinde hareketleri algılayacak algoritmalarımızı oluşturabiliriz.

Bu işlemi yaparken çalışacağımız alan NewFrameEventHandler delegesiyle işaretlenmiş olan “FinalVideoSource_NewFrame” metodumuz olacaktır. Çünkü bu metot her bir görüntü geldiğinde tetiklenmekte ve o anki elde edilen görüntüyü bir öncekiyle kıyaslama imkanı tanımaktadır.

Ayriyetten, elde edilen görüntü üzerinde yapılacak hareket algılamasını hangi algoritmayla icra edeceğimizide belirtmemiz gerekmektedir. Bu işlem için AForge.NET kütüphanesinde;

hareket algılama algoritmaları mevcuttur.

Ve bunların yanında;

olmak üzere hareket işleme algoritmalarıda bulunmaktadır.

Tüm algoritmalarda kavranması gereken ortak yapı aşağıdaki gibidir;

        MotionDetector detector = new MotionDetector(-Hareket Algılama Algoritması-, -Hareket İşleme Algoritması-);
        private void FinalVideoSource_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
        {
            Bitmap image = (Bitmap)eventArgs.Frame.Clone();
            #region Hareket Algılama
            //Hareket var mı? kontrol edilir. Varsa eğer image üzerinde algoritmalara uygun çalışma gerçekleştirilir.
            if (detector.ProcessFrame(image) > 0.02)
            {
                //Eğer hareket algılanırsa burası tetiklenir.
                pictureBox1.Image = image;
                //Haliyle çalışma yapılmış o anki görüntü PictureBox nesnesine aktarılır.
            }
            pictureBox1.Image = image;
            #endregion
        }

Şimdi biraz da bu algoritmalar üzerinde konuşalım.
Öncelikle hareket algılama algoritmalarını ele alalım.

Two frames difference motion detector

Bu algoritma işlevsel olarak en basit lakin performans olarakta en hızlısıdır. Hareketi algılayabilmek için T anındaki bir görüntüyle T + 1 anındaki görüntüyü kıyaslayarak aradaki farkı vurgulamaktadır. Ancak hareketli görüntüyü tam olarak vurgulamak için %100 bir performans gösterememektedir. Sadece hareketin algılanması gereken noktalarda tavsiye edilir.

Simple background modeling motion detector

Bu algoritma; yukarıdaki algoritmaya nazaran T ve T + 1 anındaki çerçeveler arasındaki farkı bularak vurgulamaktadır. Algılanan hareketi daha net ve kesin vurgulama özelliğine sahiptir.

Custom frame difference motion detector

Özel bir çerçeveyle mevcut videonun T zamanındaki bir karesini kıyaslayarak hareket algılayan algoritmadır. Kullanıcı özel çerçeveyi manuel olarak belirlemekle mükelleftir. Aksi taktirde varsayılan olarak ilk video karesi çerçeve olarak kabul edilecektir.

Şimdide sıra hareket işleme algoritmalarını ele almaya geldi.

Motion area highlighting

Bu algoritma sadece belirtilen renkte hareketi vurgulamaktadır. Tüm hareket algılama algoritmalarıyla birlikte kullanılabilir.

Motion border highlighting

Bu hareket işleme algoritması ise sadece belirtilen renkte algılanan harekete kenarlık oluşturmaktadır. Başka bir deyişle hareketi diktörtgen içine alarak vurgulamaktadır. SimpleBackgroundModelingDetector ve CustomFrameDifferenceDetector algoritmalarıyla kullanılabilir.

Grid motion area processing

Bu algoritma algılanan hareket üzerinde ızgara misali bir vurgulama imkanı sağlamaktadır. Vurgulama anında oluşturulacak hücre miktarı kullanıcı tarafından belirtilebilmekte ve oluşturulacak ızgaranın hücre boyları miktar ile ters orantılı olarak küçülmektedir. Bu da hassasiyeti arttırmaktadır. Bir yandan her bir hücre için hareket seviyesi ayrı olarak hesaplanmaktadır.

Blob counting objects processing

Bu algoritma birbirinden bağımsız ayrı nesneleri rengi belirtilebilen bir dikdörtgen ile vurgulamayı sağlamaktadır. Sınırlar manuel olarak belirtilebilmektedir. Mesela belirtilen boyuttan küçük olan nesnelerin hareketleri görmezden gelinebilir.

Evet… Şimdi sıra bu algoritmaları kullanarak pratik uygulamaya gelmiş bulunmaktadır.

Örnek 1
Hareket Algılama Algoritması : Two frames difference motion detector
Hareket İşleme Algoritması : Motion area highlighting

        MotionDetector detector = new MotionDetector(new TwoFramesDifferenceDetector(), new MotionAreaHighlighting { HighlightColor = Color.Red });
        private void FinalVideoSource_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
        {
            Bitmap image = (Bitmap)eventArgs.Frame.Clone();
            #region Hareket Algılama

            if (detector.ProcessFrame(image) > 0.02)
                pictureBox1.Image = image;
            pictureBox1.Image = image;
            #endregion
        }


Videodan da gördüğünüz üzere AForge.NET kütüphaneleri aracılığıyla kameradaki görüntüyü rahatlıkla algılayarak vurgulamış bulunmaktayız.

Örnek 2
Hareket Algılama Algoritması : Two frames difference motion detector
Hareket İşleme Algoritması : Grid motion area processing

        MotionDetector detector = new MotionDetector(new TwoFramesDifferenceDetector(), new GridMotionAreaProcessing() { GridHeight = 5000, GridWidth = 5000 /*ne kadar kare olacağını belirliyor*/, HighlightColor = Color.DarkSlateGray });
        private void FinalVideoSource_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
        {
            Bitmap image = (Bitmap)eventArgs.Frame.Clone();
            #region Hareket Algılama

            if (detector.ProcessFrame(image) > 0.02)
                pictureBox1.Image = image;
            pictureBox1.Image = image;
            #endregion
        }

Örnek 3
Hareket Algılama Algoritması : Two frames difference motion detector
Hareket İşleme Algoritması : Blob counting objects processing

        MotionDetector detector = new MotionDetector(new TwoFramesDifferenceDetector(), new BlobCountingObjectsProcessing() { HighlightColor = Color.MediumVioletRed, MinObjectsHeight = 70, MinObjectsWidth = 70, HighlightMotionRegions = true });
        private void FinalVideoSource_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
        {
            Bitmap image = (Bitmap)eventArgs.Frame.Clone();
            #region Hareket Algılama

            if (detector.ProcessFrame(image) > 0.02)
                pictureBox1.Image = image;
            pictureBox1.Image = image;
            #endregion
        }

Evet arkadaşlar. Rastgele seçtiğim algoritmalarla bir kaç örnek sergilemiş bulunmaktayım. Artık ihtiyacınıza dönük doğru algoritmayı seçip kullanmak sizlere kalmış bulunmaktadır.

Ve son olarak nihayetinde gayemiz doğrultusunda tüm iş yükünü AForge.NET kütüphanesi üstlendiği ve bizlere sadece sınıflarını kullanma zahmetini bıraktığı için bu kütüphaneyi üretenlerede edeceğiniz teşekkürü hatırlatır ve makalemizi burada sonlandırırım.

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

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. Vahdet dedi ki:

    Merhaba. Çok güzel bir çalışma ancak kütüphaneleri eklememe rağmen programı çalıştıramadım. Son örneğin proje dosyasına ulaşabilir miyim. Yardımcı olur musunuz.

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.