Merhabalar,
Bu konuda, bir bilgisayara bir webcam ile aldığımız fotoğrafların önceden belirlenmiş statik bir arkaplana göre değişimlerini buldurmaya, buna bağlı olarakta o anda oluşan hareketi algılatmaya çalışacağız.
Programın şöyle çalışması gerekiyor:
- Kamerayı başlat
- İlk fotoğrafı statik arkaplan olarak belirle
- Önceden belirlediğimiz arkaplan ile yeni gelen fotoğrafın farklı piksellerini tespit et (Background subtraction)
- Farklı olan bölgeyi işaretle
Hemen bir WebCam sınıfı yazalım, webcamden görüntü almak için illa sınıf yazmanıza gerek yok bu arada.
Fonksiyonların adları ne yaptıklarını açıkça belirtiyor. Karşılaştırma yaparken gray formatında işlem yapacağız renklerden oluşacak yanlışlardan kaçınmak adına.
Burada, “WebCam” sınıfını miras alan bir “MotionDetector” sınıfı tanımladık. Gördüğünüz üzere, sınıf örneklendiği an kameradan alınan ilk fotoğrafı işlem yapabileceğimiz formata getirip “static_background” adı altında bir değişkene atıyor. Devamında programın kullanışlığını arttırmak için yazdığımız fonksiyonlar bulunuyor.
Yukarıda temel iki fonksiyonumuz bulunuyor. İşi yapan fonksiyon olan, “detect_motion” fonksiyonu, “frame” adı altında önceden belirlenmiş arkaplan ile karşılaştırılacak olan fotoğrafı alıyor.
frame_delta = cv2.absdiff(self.static_background, self.frame_blur(self.frame_gray(frame)))
Fonksiyondaki asıl olay olan karşılaştırma işlemi, yukarıdaki satırda gerçekleşiyor. Sonrasında sadece farklı olan bölgeleri daha da belirginleştirip o bölgelerin konumlarını döndürtüyoruz.
Program çalıştığında çalıştırılması beklenen fonksiyon olan “main” fonksiyonu ise, sürekli kameradan fotoğraf alıp hareketi yani değişimi tespit edebilmek için “detect_motion” fonksiyonuna gönderiyor ve dönen değerleri orijinal fotoğraf üzerinde işaretleyip kullanıcıya sunuyor.
Kodların tamamı: https://github.com/r0ark/motion-detector
Nasıl çalıştığına verdiğim linkteki videodan bakabilirsiniz ama örnek bir fotoğraf bırakmak istiyorum.
Bitirmeden önce, bu projenin çok kolay manipüle edilebileceğini söylemek istiyorum. Hava kararmaya başladığı gibi sapıtacaktır program. Bunun ötesinde, büyük bölümü hareketsiz olan bir alanda kullanılmalı böyle bir şey.
Anlayamadığınız yerde, bilgim neticesinde yardımcı olurum, kolay gelsin