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;
- Two frames difference motion detector
- Simple background modeling motion detector
- Custom frame difference motion detector
hareket algılama algoritmaları mevcuttur.
Ve bunların yanında;
- Motion area highlighting
- Motion border highlighting
- Grid motion area processing
- Blob counting objects processing
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…

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.
Abi yüzün üzerine nasıl isim yazdırıcaz onu da açıklayabilir misin yetiştirmem gereken çok acil bi projem var