- Raspberry Pi mit Buster und OpenCV einrichten
- Hinzufügen eines Summers zum Raspberry Pi 5-Zoll-Display
- Programmierung von Raspberry Pi für die CCTV-Bewegungserkennung
- Bewegungserkennung auf OpenCV mit Raspberry Pi
- Einstellen des Alarms für die Bewegungserkennung
- Überwachung der CPU-Temperatur und -Nutzung
- Starten Sie Ihren Pi CCTV Motion Detector
OpenCV ist ein leistungsstarkes Tool, das in Kombination mit Raspberry Pi Türen zu vielen tragbaren Smart-Geräten öffnen kann. In unserem vorherigen Artikel zur CCTV-Überwachung von Raspberry Pi haben wir gelernt, wie Sie mit RTSP Live-CCTV-Videos von einem DVR abrufen und auf einem Raspberry Pi anzeigen. Überprüfen Sie dies, bevor Sie fortfahren. In diesem Artikel erfahren Sie, wie Sie die Leistung von OpenCV nutzen und ein Raspberry Pi Motion Detection- System auf unseren Live-CCTV-Aufnahmen aufbauen können. Wenn Sie keine Videoüberwachung installiert haben, können Sie dennoch ein Raspberry Pi-Überwachungssystem erstellen, indem Sie USB-Kameras direkt an Ihren Pi anschließen. Und wenn Sie kein großer Fan von Pi und Python sind, können Sie mit ESP32 etwas Ähnliches bauen. Weitere Informationen finden Sie unter ESP32 Wi-Fi-Türklingel.
Wir werden ein Python-Skript schreiben, das alle vier CCTV-Kameras gleichzeitig auf Aktivitäten (Bewegungen) überwachen kann. Wenn eine Aktivität auf einer Kamera erkannt wird, wechselt unser Raspberry Pi automatisch zu diesem bestimmten Kamerabildschirm und hebt hervor, welche Aktivität stattgefunden hat. Dies alles in Echtzeit mit nur 1,5 Sekunden Verzögerung. Ich habe auch eine Alarmfunktion hinzugefügt, z. B. einen Summer, mit dem der Benutzer durch Piepen benachrichtigt werden kann, wenn eine Aktivität erkannt wird. Aber Sie können dies leicht skalieren, um eine Nachricht oder eine E-Mail zu senden oder was nicht! Aufregend richtig !! Lass uns anfangen
Raspberry Pi mit Buster und OpenCV einrichten
Ich verwende den Raspberry Pi 3 B + mit Buster OS und die Version von OpenCV ist 4.1. Wenn Sie völlig neu sind, befolgen Sie die folgenden Tutorials, bevor Sie beginnen können.
Das Ziel ist es, Ihren Pi bereit für die Entwicklung zu haben. Es ist in Ordnung, eine beliebige Version von Raspbian OS auf Ihrem Pi zu haben, aber stellen Sie sicher, dass die Version von OpenCV 4.1 oder höher ist. Sie können entweder dem obigen Tutorial folgen, um Ihr OpenCV zu kompilieren, was Stunden dauern wird, aber für schwere Projekte zuverlässiger ist, oder es einfach direkt von pip mit den folgenden Befehlen installieren.
$ pip installiere opencv-contrib-python == 4.1.0.25
Wenn Sie OpenCV zum ersten Mal mit pip installieren, müssen Sie auch die anderen Abhängigkeiten installieren. Verwenden Sie dazu die folgenden Befehle.
$ sudo apt-get installiere libavcodec-dev libavformat-dev libswscale-dev libv4l-dev $ sudo apt-get installiere libxvidcore-dev libx264-dev $ sudo apt-get installiere libatlas-base-dev gfortran $ sudo apt-get installiere libhdf5- dev libhdf5-serial-dev libhdf5-103 $ sudo apt-get installiere libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
Wir haben bereits viele Raspberry Pi OpenCV-Projekte erstellt. Weitere Inspirationen finden Sie hier.
Hinzufügen eines Summers zum Raspberry Pi 5-Zoll-Display
Auf der Hardwareseite haben wir nur ein 5-Zoll-Display und einen Summer. Nachdem wir das 5-Zoll-Display mit Raspberry Pi verbunden haben, können wir den Summer direkt an der Rückseite des Displays anbringen, wodurch einige GPIO-Pins für uns verlängert wurden. Ich habe meinen Summer wie unten gezeigt angeschlossen.
Wenn Sie mehr E / A-Pins verwenden möchten, ist die folgende Pin-Beschreibung hilfreich. Wie Sie unter den erweiterten Pins sehen können, werden die meisten Pins vom Display selbst für eine Touchscreen-Oberfläche verwendet. Trotzdem haben wir die Pins 3,5,7,8,10,11,12,13,15,16 und 24, die keine Verbindung haben, und wir können sie für unsere eigene Anwendung verwenden. In diesem Tutorial habe ich einen Summer an GPIO 3 angeschlossen.
Programmierung von Raspberry Pi für die CCTV-Bewegungserkennung
Das vollständige Python-Skript für dieses Projekt finden Sie unten auf dieser Seite. Lassen Sie uns jedoch jedes Segment des Codes diskutieren, um zu verstehen, wie es funktioniert.
Überwachen mehrerer Kameras ohne Verzögerung auf Raspberry Pi mit RTSP
Der herausfordernde Teil bei dieser Arbeit bestand darin, die Belastung von Raspberry Pi zu reduzieren, um eine Verzögerung beim Streaming zu vermeiden. Anfangs habe ich versucht, zwischen allen vier Kameras zu wechseln, um nach Bewegung zu suchen, aber es war sehr verzögert (ca. 10 Sekunden). Also habe ich alle vier Kameras zu einem einzigen Bild kombiniert und alle Bewegungserkennungsaktivitäten für dieses Bild durchgeführt. Ich habe zwei Funktionen geschrieben, nämlich eine Kamera erstellen und eine Kamera lesen.
Mit der Funktion Kamera erstellen wird die Kamera mit ihrer jeweiligen Kanalnummer geöffnet. Beachten Sie, dass die RTSP-URL mit „02“ endet. Dies bedeutet, dass ich den Sub-Stream-Video-Feed verwende, dessen Auflösung niedrig und daher schneller zu lesen ist. Auch die Art des verwendeten Video-Codecs trägt zur Geschwindigkeit bei. Ich habe mit verschiedenen Codes experimentiert und festgestellt, dass FFMPEG das Fasten aller ist.
def create_camera (channel): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / channel /" + channel + "02" # Ändern Sie die IP entsprechend Ihr cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # ID-Nummer für Breite ist 3 cap.set (4, cam_height) # ID-Nummer für Höhe ist 480 cap.set (10, 100)) # ID-Nummer für Helligkeit ist 10 Rückgabekappe
In der Funktion zum Lesen der Kamera lesen wir alle vier Nocken, nämlich cam1, cam2, cam3 und cam4, um sie alle zu einem einzigen Bild mit dem Namen Main_screen zu kombinieren. Sobald dieser Hauptbildschirm fertig ist, werden wir alle OpenCV-Arbeiten an diesem Bild durchführen.
def read_camera (): Erfolg, 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)
Das Hauptbild mit allen vier Kameras zusammen sieht wie das unten gezeigte aus.
Bewegungserkennung auf OpenCV mit Raspberry Pi
Nachdem wir das Bild fertig haben, können wir mit unserer Bewegungserkennung beginnen. Innerhalb der while-Schleife lesen wir zunächst zwei verschiedene Frames, nämlich frame1 und frame2, und konvertieren sie dann in Graustufen
frame1 = read_camera () #Lesen Sie den ersten Frame greyImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Konvertieren Sie in grey frame2 = read_camera () #Lesen Sie den zweiten Frame greyImage_F2 = cv2.cvtColor (frame2, cv2.COLOR_)
Dann machen wir einen Unterschied zwischen diesen beiden Bildern, um zu sehen, was sich geändert hat, und gruppieren mit einer Schwelle alle Orte, an denen sich etwas geändert hat, ähnlich einem Blob. Es ist auch üblich, das Bild zu verwischen und zu erweitern, um scharfe Kanten zu vermeiden.
diffImage = cv2.absdiff (greyImage_F1, greyImage_F2) #get the differance - das ist cool blurImage = cv2.GaussianBlur (diffImage, (5,5), 0) _, schwelleImage = cv2.threshold (blurImage, 20,255, cv2.THES) dilatedImage = cv2.dilate (ThresholdImage, kernal, Iterationen = 5)
Der nächste Schritt besteht darin, Zähler zu finden und den Bereich jedes Zählers zu überprüfen. Indem wir den Bereich ermitteln, können wir herausfinden, wie groß die Bewegung ist. Wenn der Bereich größer als ein angegebener Wert in der Variablen motion_detected ist , betrachten wir dies als Aktivität und zeichnen ein Feld um die Änderung, um sie für den Benutzer hervorzuheben.
Konturen, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # Kontur finden ist eine magische Funktion für Konturen in Konturen: #für jede erkannte Änderung (x, y, w, h) = cv2.boundingRect (Kontur) #get den Ort, an dem eine Änderung gefunden wurde, wenn cv2.contourArea (Kontur)> Bewegungsschwelle: cv2.rectangle (frame1, (x, y), (x + w, y + h), (255, 255, 0), 1) display_screen = find_screen ()
Mit der Funktion find_screen () wird ermittelt, wo die Aktivität zwischen den vier Kameras stattgefunden hat. Wir können das finden, da wir die x- und y-Werte der Bewegung kennen. Wir vergleichen diese x- und y-Werte mit der Position jedes Bildschirms, um herauszufinden, welcher Bildschirm Aktivität ausgelöst hat, und beschneiden diesen bestimmten Bildschirm erneut, damit wir ihn auf dem Pi-Touchscreen anzeigen können.
def find_screen (): if (x <cam_width): if (y <cam_height): screen = frame1 print ("Aktivität in cam screen 1") else: screen = frame1 print ("Aktivität in cam screen 2") else: if (y <cam_height): screen = frame1 print ("Aktivität in cam screen 3") else: screen = frame1 print ("Aktivität in cam screen 4") return (screen)
Einstellen des Alarms für die Bewegungserkennung
Sobald wir wissen, auf welchem Bildschirm eine Bewegung erkannt wird, können Sie problemlos jede Art von Alarm hinzufügen, die wir benötigen. Hier piepen wir einen Summer, der mit GPIO 3 verbunden ist. Die if- Anweisung prüft, ob die Bewegung in Bildschirm 3 erkannt wurde, und erhöht eine Variable namens trig_alarm . Sie können jeden Bildschirm Ihrer Wahl oder sogar auf mehreren Bildschirmen erkennen.
if ((x> cam_width) und (y
Wenn der Wert von trig_alarm mehr als 3 erreicht, ertönt einmal ein Summer. Der Grund für diese Zählung ist, dass ich manchmal bemerkte, dass Schatten oder Vögel einen falschen Alarm auslösten. Auf diese Weise erhalten wir nur dann einen Alarm, wenn es eine kontinuierliche Aktivität für 3 Frames gibt.
if (trig_alarm> = 3): # warte auf conts 3 Bewegungen #Beep the Buzzer GPIO.output (BUZZER, 1) time.sleep (0.02) GPIO.output (BUZZER, 0) trig_alarm = 0
Überwachung der CPU-Temperatur und -Nutzung
Das System ist so eingestellt, dass es rund um die Uhr funktioniert, und daher kann der Pi sehr heiß werden. Daher entscheide ich mich, die Temperatur und die CPU-Auslastung zu überwachen, indem ich diese Werte auf dem Bildschirm anzeige. Wir haben diese Informationen über die gpiozero-Bibliothek erhalten.
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
Starten Sie Ihren Pi CCTV Motion Detector
Ich habe dies tagelang getestet, um es zu sammeln, und es funktioniert jedes Mal und es hat wirklich Spaß gemacht, bis ich eine Kamera beschädigt habe.