- Raspberry Pi'yi Buster ve OpenCV ile Kurmak
- Raspberry Pi 5Inch Ekranına Buzzer Ekleme
- Raspberry Pi'yi CCTV Hareket Algılama için Programlama
- Raspberry Pi kullanarak OpenCV'de Hareket Algılama
- Hareket Algılama için Alarm Ayarlama
- CPU Sıcaklığını ve Kullanımını İzleme
- Pi CCTV Hareket Dedektörünüzü Başlatma
OpenCV güçlü bir araçtır ve Raspberry Pi ile birleştirildiğinde birçok taşınabilir akıllı cihaza kapı açabilir. Önceki Raspberry Pi CCTV izleme makalemizde, RTSP kullanarak bir DVR'den canlı CCTV videosu almayı ve bir Raspberry Pi'de nasıl görüntüleyeceğimizi öğrendik, devam etmeden önce bunu kontrol edin. Bu yazıda, OpenCV'nin gücünden nasıl yararlanılacağını ve canlı CCTV çekimlerimizde bir Raspberry Pi Hareket Algılama sistemi kurmayı öğreneceğiz. Kurulu bir CCTV'niz yoksa, USB kameraları doğrudan Pi'nize bağlayarak bir Raspberry Pi Gözetleme sistemi kurabilirsiniz. Pi ve Python'un büyük bir hayranı değilseniz, ESP32 ile benzer bir şey oluşturabilirsiniz, daha fazla ayrıntı için ESP32 Wi-Fi Kapı Zili'ne bakın.
Herhangi bir aktivite (hareket) için dört CCTV kamerayı aynı anda izleyebilen bir python betiği yazacağız. Herhangi bir kamerada bir etkinlik tespit edilirse, Raspberry Pi'miz otomatik olarak o kamera ekranına geçer ve hangi etkinliğin gerçekleştiğini vurgular, tüm bunlar gerçek zamanlı olarak sadece 1,5 saniye gecikmeyle. Ayrıca, bir etkinlik algılandığında kullanıcıyı bipleyerek uyarabilen zil gibi bir alarm özelliği de ekledim. Ancak, bir mesaj veya E-posta göndermek veya ne göndermek için bunu kolayca ölçeklendirebilirsiniz! Heyecan verici doğru !! Başlayalım
Raspberry Pi'yi Buster ve OpenCV ile Kurmak
Raspberry Pi 3 B + üzerinde Buster OS çalıştıran kullanıyorum ve OpenCV sürümü 4.1. Tamamen yeniyseniz, başlamadan önce aşağıdaki eğitimleri izleyin.
Amaç Pi'nizi geliştirmeye hazır hale getirmektir. Pi'nizde Raspbian OS'nin herhangi bir sürümüne sahip olmanızda bir sorun yoktur, ancak OpenCV sürümünün 4.1 veya üstü olduğundan emin olun. Saatler sürecek ancak ağır projeler için daha güvenilir olan OpenCV'nizi derlemek için yukarıdaki öğreticiyi takip edebilir veya aşağıdaki komutları kullanarak doğrudan pip'ten kurabilirsiniz.
$ pip kurulum opencv-katkıda-python == 4.1.0.25
OpenCV'yi pip ile ilk kez kuruyorsanız, diğer bağımlılıkları da kurmanız gerekir. Bunun için aşağıdaki komutları kullanın.
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev $ sudo apt-get install libxvidcore-dev libx264-dev $ sudo apt-get install libatlas-base-dev gfortran $ sudo apt-get install libhdf5- dev libhdf5-serial-dev libhdf5-103 $ sudo apt-get install libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
Halihazırda birçok Raspberry Pi OpenCV projesi oluşturduk, ayrıca daha fazla ilham almak için bunu kontrol edebilirsiniz.
Raspberry Pi 5Inch Ekranına Buzzer Ekleme
Donanım tarafında 5 İnçlik Ekran ve Buzzer dışında pek bir şeye sahip değiliz. Raspberry Pi ile 5 İnç Ekranı Birleştirdikten sonra, zili doğrudan bizim için bazı GPIO pinlerini genişleten ekranın arka tarafına monte edebiliriz. Buzzer'ımı aşağıda gösterildiği gibi bağladım.
Daha fazla G / Ç pini kullanmakla ilgileniyorsanız, aşağıdaki pim açıklaması faydalı olacaktır. Genişletilmiş pinler arasında görebileceğiniz gibi, pinlerin çoğu Ekranın kendisi tarafından bir dokunmatik ekran arayüzü için kullanılmaktadır. Ama yine de, bağlantısı olmayan 3,5,7,8,10,11,12,13,15,16 ve 24 pinlerimiz var ve bunu kendi uygulamamız için kullanabiliriz. Bu eğitimde, GPIO 3'e bir zil bağladım.
Raspberry Pi'yi CCTV Hareket Algılama için Programlama
Bu proje için tam python betiği bu sayfanın altında bulunabilir, ancak nasıl çalıştığını anlamak için kodun her bir bölümünü tartışalım.
RTSP kullanarak Raspberry Pi'de Gecikme Olmadan Birden Fazla Kamerayı İzleme
Bu işi yapmanın zor kısmı, akışta bir gecikmeyi önlemek için Raspberry pi üzerindeki yükü azaltmaktı. Başlangıçta, hareket aramak için dört kameranın tümü arasında geçiş yapmayı denedim ama çok gecikti (yaklaşık 10 saniye). Bu yüzden dört kamerayı tek bir görüntüde birleştirdim ve tüm hareket algılama etkinliklerini o görüntü üzerinde yaptım. Kamera oluşturmak ve kamera okumak olmak üzere iki fonksiyon yazdım.
Kamerayı oluşturmak fonksiyonu, ilgili kanal numarası ile kam açmak için kullanılır. RTSP URL'sinin "02" ile bittiğini unutmayın; bu, çözünürlüğü düşük ve dolayısıyla okuması daha hızlı olacak alt akış video beslemesini kullanıyorum anlamına gelir. Ayrıca, kullandığınız video codec türü de hıza katkıda bulunuyor, farklı kodlarla deneyler yaptım ve FFMPEG'in hepsinin orucu olduğunu gördüm.
def create_camera (kanal): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Akış / kanallar /" + kanal + "02" # IP'yi uyacak şekilde değiştirin seninki cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # Genişlik için kimlik numarası 3 cap.set (4, cam_height) # Yükseklik için kimlik numarası 480 cap.set (10, 100) # Parlaklık için kimlik numarası 10 dönüş başlığıdır
Gelen okuma kamera fonksiyonu, biz denilen tek bir görüntü içine hepsini birleştirmek yani Cam1, CAM2, cam3 ve cam4 dört kameraları okuyacaktır Main_screen . Bu ana ekran hazır olduğunda, tüm OpenCV çalışmalarımızı bu görüntü üzerinde yapacağız.
def read_camera (): success, current_screen = cam1.read () Main_screen = current_screen success, current_screen = cam2.read () Main_screen = current_screen success, current_screen = cam3.read () Main_screen = current_screen success, current_screen = cam4.read () Main_screen = current_screen return (Main_screen)
Dört kameranın tümünün bir araya geldiği ana ekran görüntüsü aşağıda gösterilen görüntü gibi görünecektir.
Raspberry Pi kullanarak OpenCV'de Hareket Algılama
Artık görüntüyü hazırladığımıza göre, hareket algılamaya başlayabiliriz. While döngüsünün içinde, çerçeve1 ve çerçeve2 olmak üzere iki farklı çerçeveyi okuyarak başlıyoruz, ardından bunları gri tonlamaya dönüştürüyoruz.
frame1 = read_camera () # İlk kareyi oku grayImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Gri frame2'ye dönüştür = read_camera () # 2. kareyi oku grayImage_F2 = cv2.cvtColor (frame2, cv2.CAYGR2)
Sonra neyin değiştiğini görmek için bu iki görüntü arasında bir fark alıyoruz ve bir eşikle, bir damla gibi, değişiklik olan tüm yerleri gruplandırıyoruz. Keskin kenarlardan kaçınmak için görüntüyü bulanıklaştırmak ve büyütmek de yaygındır.
diffImage = cv2.absdiff (grayImage_F1, grayImage_F2) # farkı elde edin - bu harika blurImage = cv2.GaussianBlur (diffImage, (5,5), 0) _, eşikImage = cv2.threshold (blurImage, 20,255, cv2.THRESH_BINARY) dilatedImage = cv2.dilate (eşikİmage, kernal, yinelemeler = 5)
Sonraki adım, sayaçları bulmak ve her sayacın alanını kontrol etmek, alanı bularak hareketin ne kadar büyük olduğunu bulabiliriz. Alan, motion_detected değişkeninde belirtilen bir değerden büyükse , bunu bir etkinlik olarak kabul eder ve kullanıcıya vurgulamak için değişikliğin etrafına bir kutu çizeriz.
contours, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find kontur, konturlardaki kontur için sihirli bir işlevdir: # algılanan her değişiklik için (x, y, w, h) = cv2.boundingRect (kontur) # cv2.contourArea (kontur)> motion_threshold ise: cv2.rectangle (frame1, (x, y), (x + w, y + h), (255, 255, 0) ise değişikliğin bulunduğu konumu alın, 1) display_screen = find_screen ()
Find_screen () işlevi, dört kamera arasında etkinliğin nerede gerçekleştiğini bulmak için kullanılır. Hareketin x ve y değerlerini bildiğimiz için bunu bulabiliriz. Bu x ve y değerlerini, hangi ekranın etkinlik verdiğini bulmak için her bir ekranın konumuyla karşılaştırıyoruz ve yine o belirli ekranı kırparak pi dokunmatik ekranda görüntüleyebiliyoruz.
def find_screen (): if (x <cam_width): if (y <cam_height): screen = frame1 print ("Activity in cam screen 1") else: screen = frame1 print ("Kamera ekranı 2'deki aktivite"), aksi takdirde: eğer (y <cam_height): screen = frame1 print ("Camera screen 3'teki aktivite"), else: screen = frame1 print ("Kamera ekranı 4'teki aktivite") dönüş (ekran)
Hareket Algılama için Alarm Ayarlama
Hangi ekranda hareketin algılandığını öğrendikten sonra, ihtiyacımız olan her türlü alarmı eklemek kolaydır. Burada GPIO 3'dekinden bağlı bir zili bipleyecektir eğer deyim kontroller hareket ekranında 3 ve artışlarla adında bir değişken saptandı eğer trig_alarm . Seçtiğiniz herhangi bir ekranı veya hatta birden fazla ekranı tespit edebilirsiniz.
eğer ((x> cam_width) ve (y
Trig_alarm değeri 3'ten fazlaysa, bir kez sesli uyarı veririz. Bu sayımın nedeni, bazen gölgelerin veya kuşların sahte alarm oluşturduğunu fark ettim. Yani bu şekilde sadece 3 kare boyunca sürekli bir aktivite varsa, bir alarm alacağız.
eğer (trig_alarm> = 3): # 3 hareket için bekleyin # Buzzer'ı koruyun GPIO.output (BUZZER, 1) time.sleep (0.02) GPIO.output (BUZZER, 0) trig_alarm = 0
CPU Sıcaklığını ve Kullanımını İzleme
Sistem 7x24 çalışacak şekilde girintilidir ve bu nedenle Pi çok ısınabilir, bu yüzden bu değerleri ekranda görüntüleyerek sıcaklığı ve CPU kullanımını izlemeye karar verdim. Bu bilgileri gpiozero kütüphanesini kullanarak elde ettik.
cpu = CPUTemperature () load = LoadAverage () cpu_temperature = str ((cpu.temperature) // 1) load_average = str (load.load_average) #print (cpu.temperature) #print (load.load_average) cv2.putText (display_screen, cpu_temperature, (250,250), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0,0,255), 1) cv2.putText (display_screen, load_average, (300,250), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0,255,0), 2)
Pi CCTV Hareket Dedektörünüzü Başlatma
Bunu günlerce test ettim ve her seferinde çalışıyor ve bir kameraya zarar verene kadar gerçekten eğlenceli bir yapıydı.