[PYTHON] Ich habe versucht, mit OpenCV eine Bewegungserkennungsüberwachungskamera mit einer WEB-Kamera mit Raspberry Pi herzustellen

Was du machen willst

Es scheint, dass verdächtige Personen am Eingang der Wohnung erscheinen, in der ich wohne. Deshalb habe ich eine WEB-Kamera an der Eingangstür angebracht und ein System zur Analyse und Aufzeichnung mit Raspberry Pi erstellt. Die Spezifikationen sind wie folgt.

Artikel, auf die verwiesen wird

Zuerst habe ich mich für die Gesichtserkennung entschieden, indem ich mich auf den Artikel von PC Kobo-san bezogen habe, aber er ist für diese Anwendung nicht geeignet, da es viele Fehlalarme gibt. Es war.

https://www.pc-koubou.jp/magazine/19205

Aufgrund verschiedener Überlegungen dachte ich, dass dies durch Bewegungserkennung realisiert werden könnte (Erkennung, dass sich das aufgenommene Bild geändert hat), und als Ergebnis von Versuch und Irrtum lief es gut, daher werde ich die Methode vorstellen.

Außerdem habe ich auf diesen Artikel verwiesen, um Bewegungen zu erkennen.

https://qiita.com/K_M95/items/4eed79a7da6b3dafa96d

Dinge notwendig

Informationen zum Installationsverfahren von OpenCV finden Sie im obigen Artikel PC Studio. Python verwendet die bereits enthaltene.

Bauverfahren

  1. Raspberry Pi Setup
  2. Richten Sie die VNC-Umgebung nach Bedarf ein
  3. Installieren Sie OpenCV
  4. Schließen Sie die WEB-Kamera an
  5. Überprüfen Sie, ob die WEB-Kamera erkannt wird
  6. Schreiben Sie das Programm und führen Sie es aus

Bestätigung der WEB-Kameraerkennung

Es scheint, dass der Treiber von Anfang an in der über USB angeschlossenen WEB-Kamera enthalten ist. Wenn Sie ihn also anschließen, wird er erkannt.

$ lsusb
Bus 001 Device 006: ID 0c45:62e0 Microdia MSI Starcam Racer
Bus 001 Device 005: ID 0424:7800 Standard Microsystems Corp. 
Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Es ist in Ordnung, wenn der Name einer USB-Kamera im Ergebnis des Befehls lsusb angezeigt wird. Wenn Sie es nicht wissen, überprüfen Sie, ob sich die Anzahl der Elemente erhöht, wenn Sie den Netzstecker ziehen und eine Verbindung herstellen.

Quellcode

Der Code, den ich geschrieben habe, lautet wie folgt.

security_cam_motion.py


 # -*- coding: utf-8 -*-
import time
import datetime
import cv2 as cv

#Ein Programm, das eine Überwachungskamera mit einer WEB-Kamera realisiert
#Bewegungserkennung, speichern Sie die JPG-Datei mit dem zu diesem Zeitpunkt eingebetteten Datum und der Uhrzeit


#Verzeichnis zum Speichern von Bildern
save_dir  = './image/'

#Der Dateiname sollte eine Zeichenfolge sein, die Datum und Uhrzeit enthält
#Geben Sie den Dateinamen an, der nach Datum und Uhrzeit hinzugefügt werden soll
fn_suffix = 'motion_detect.jpg'

#Erstellen Sie eine Instanz von VideoCapture.
cap = cv.VideoCapture(0) 

#Geben Sie die vertikale und horizontale Auflösung an
cap.set(cv.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv.CAP_PROP_FRAME_HEIGHT, 480)

#Pixelwert bei Binärisierung
DELTA_MAX = 255

#Schwellenwert zum Erkennen von Änderungen in jedem Punkt
DOT_TH = 20

#Bewegungsfaktor(Wie viele Punkte haben sich geändert?)Aber
#Wie viel oder mehr solltest du aufnehmen?
MOTHON_FACTOR_TH = 0.20

#Daten zum Vergleich speichern
avg = None

while True:
    
    ret, frame = cap.read()     #1 Bild lesen
    motion_detected = False     #Flag, das angibt, ob eine Bewegung erkannt wurde

    dt_now = datetime.datetime.now() #Zeitpunkt der Datenerfassung

    #Dateiname sowie Datum und Uhrzeit zum Einbetten in das Bild
    dt_format_string = dt_now.strftime('%Y-%m-%d %H:%M:%S') 
    f_name = dt_now.strftime('%Y%m%d%H%M%S%f') + "_" + fn_suffix


    #Mach es monochrom
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    
    #Holen Sie sich einen Rahmen zum Vergleich
    if avg is None:
        avg = gray.copy().astype("float")
        continue
        
    
    #Berechnen Sie die Differenz zwischen dem aktuellen Frame und dem gleitenden Durchschnitt
    cv.accumulateWeighted(gray, avg, 0.6)
    frameDelta = cv.absdiff(gray, cv.convertScaleAbs(avg))

    #Führen Sie eine Schwellenwertverarbeitung für Delta-Bilder durch
    thresh = cv.threshold(frameDelta, DOT_TH, DELTA_MAX, cv.THRESH_BINARY)[1]

    #Berechnen Sie den Bewegungsfaktor. Wie viel hat sich insgesamt verändert?
    motion_factor = thresh.sum() * 1.0 / thresh.size / DELTA_MAX 
    motion_factor_str = '{:.08f}'.format(motion_factor)
    
    #Schreiben Sie Datum und Uhrzeit auf das Bild
    cv.putText(frame,dt_format_string,(25,50),cv.FONT_HERSHEY_SIMPLEX, 1.5,(0,0,255), 2)
   #Bewegung zum Bild_Faktorwert schreiben
    cv.putText(frame,motion_factor_str,(25,470),cv.FONT_HERSHEY_SIMPLEX, 1.5,(0,0,255), 2)
    
    #Wenn der Bewegungsfaktor den Schwellenwert überschreitet, wird eine Bewegung erkannt.
    if motion_factor > MOTHON_FACTOR_TH:
        motion_detected = True
    
    #Speichern Sie das Bild, wenn eine Bewegung erkannt wird
    if motion_detected  == True:
        #save
        cv.imwrite(save_dir + f_name, frame)
        print("DETECTED:" + f_name)
    
    
    #Von hier aus wird das Bild verarbeitet, das auf dem Bildschirm angezeigt werden soll
    #Fügen Sie der Bildschwelle eine Kontur hinzu
    image, contours, hierarchy = cv.findContours(thresh.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    frame = cv.drawContours(frame, contours, -1, (0, 255, 0), 3)
    
    
    #Zeigen Sie das resultierende Bild an
    cv.imshow('camera', frame)


    #Warten Sie, bis eine Taste gedrückt wird
    k = cv.waitKey(1000)  #Argument ist Wartezeit(ms)
    if k == 27: #Beenden Sie, wenn Esc eingegeben wird
        break
    

print("Bye!\n")
#Schließen Sie das angezeigte Fenster
cap.release()
cv.destroyAllWindows()

Befehl starten

$ sudo python security_cam_motion.py

Ausführungsergebnis

Als Ergebnis der Ausführung sieht es so aus.

Wenn sich nichts ändert, passiert nichts. Die Zahl unten ist der Bewegungsfaktor. Da es keine Änderung gibt, ist es 0.0. image.png

Wenn eine Person vor dem Eingang erscheint, wird die Änderung erkannt und die JPEG-Datei gespeichert. Da der Bewegungsfaktor über einem bestimmten Niveau liegt, können Sie sehen, dass die Bewegung erkannt wurde.

image.png

Der Rand wird in der gespeicherten JPEG-Datei nicht angezeigt. image.png

Über den Bewegungsfaktor

Bewegungsfaktor ist ein Wort, das ich selbst geprägt habe. Ein Koeffizient, der angibt, wie stark sich die Pixel des gesamten Bildschirms geändert haben.

Es wird als Bewegungserkennung bezeichnet, aber das Prinzip ist, dass Sie nach Pixeln suchen, die sich vom vorherigen Bild unterscheiden. Bei einer geringfügigen Änderung der Umgebung kann ein geringfügiger Unterschied zum vorherigen Frame festgestellt werden. Wenn es jedes Mal erkannt wird, ist die Überwachungskamera nicht nützlich. Wenn andererseits eine Person vor der Kamera steht, sollte sich ein erheblicher Prozentsatz der Pixel ändern. Wenn Sie sich entscheiden, aufzuzeichnen, wenn sich ein bestimmter Prozentsatz ändert, können Sie anscheinend den Zweck "Aufzeichnen, wenn eine Person vor den Eingang kommt" erreichen.

Über falsch positive Ergebnisse

Denken Sie an falsch positive falsch positive. Mit anderen Worten, wie man mit "Erkennen, wann niemand kommt" umgeht. Menschen kommen selten, weil der Ort, an dem die Überwachungskamera installiert ist, nur ein Raum in einer Wohnung ist. Daher ist es ein Problem, wenn die Daten mit falsch positiven Ergebnissen gefüllt sind. Überlegen Sie, wie Sie Fehlalarme verhindern können. Es scheint, dass wie viel Änderung es geben sollte ... durch den Bewegungsfaktor und das zweite Argument der Funktion "cv.threshold ()" (der Schwellenwert für die Änderung jedes Punkts gegenüber dem vorherigen Bild) angepasst werden kann. Da die Variable DOT_TH das zweite Argument ist, passen Sie sie mit dieser Variablen an. Wenn der Wert zu klein ist, wird er aufgrund von Änderungen in der Umgebung oder Schwankungen in den Pixeln fälschlicherweise erkannt. Trotzdem erkennen einige Pixel Änderungen manchmal auch ohne tatsächliche Bewegung fälschlicherweise, sodass der Bewegungsfaktor Fehlalarme verhindert.

   : 
#Schwellenwert zum Erkennen von Änderungen in jedem Punkt
DOT_TH = 20
#Bewegungsfaktor(Wie viele Punkte haben sich geändert?)Aber
#Wie viel oder mehr solltest du aufnehmen?
MOTHON_FACTOR_TH = 0.20
   :
#Führen Sie eine Schwellenwertverarbeitung für Delta-Bilder durch
thresh = cv.threshold(frameDelta, DOT_TH, DELTA_MAX, cv.THRESH_BINARY)[1]
#Berechnen Sie den Bewegungsfaktor. Wie viel hat sich insgesamt verändert?
motion_factor = thresh.sum() * 1.0 / thresh.size / DELTA_MAX 
motion_factor_str = '{:.08f}'.format(motion_factor)
   :

Über falsch positive (falsch negative)

Andererseits ist "es gibt eine Person, aber sie wird nicht aufgezeichnet" als Überwachungskamera nicht nützlich. Wahrscheinlich gibt es in diesem System Menschen, aber die Fälle, die nicht aufgezeichnet wurden, sind "Kleidung mit der gleichen Farbe wie die Wand tragen", "am Rand des Bildschirms abgeschnitten", "optische Tarnung tragen". Ich werde. In diesem Fall habe ich beschlossen, es zu tolerieren, weil ich nicht weiß, was auf dem Bild zu sehen ist und es möglicherweise nicht nützlich ist. Es macht keinen Sinn, nach Perfektion zu suchen. Balance ist wichtig.


das ist alles

Recommended Posts

Ich habe versucht, mit OpenCV eine Bewegungserkennungsüberwachungskamera mit einer WEB-Kamera mit Raspberry Pi herzustellen
Erstellen Sie eine WEB-Überwachungskamera mit Raspberry Pi und OpenCV
Ich habe versucht, mit Raspeye 4 (Python Edition) ein signalähnliches Signal zu erzeugen.
Ich habe versucht, [eine bestimmte Aufgabe] mit einem Raspeltorte zu automatisieren
Ich habe zum ersten Mal eine Überwachungskamera mit Raspberry PI gemacht.
Ich habe eine Web-API erstellt
Ich habe mit Razpai einen Webserver erstellt, um Anime zu schauen
So erstellen Sie eine Überwachungskamera (Überwachungskamera) mit Opencv und Python
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
Ich habe versucht, mit OpenCV Bewegungen schnell zu erkennen
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
Ich habe versucht, mit Raspeye + Tact Switch eine Schaltfläche für Slack zu erstellen
Ein Memorandum bei der Herstellung einer Überwachungskamera mit Raspeye
Ich habe versucht, Raspeye und conect + mit der Web-API zu verbinden
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Ich habe mit PyQt einen einfachen Texteditor erstellt
Verwenden einer Webkamera mit Raspberry Pi
Ich wollte den Motor mit einer Raspeltorte laufen lassen, also habe ich versucht, das Motor Driver Board von Waveshare zu verwenden
[5.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[2nd] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck für "Betrag" zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck von "Zeit" zu erstellen
[3.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck von "Datum" zu erstellen
Ich habe versucht, mit Python eine 2-Kanal-Post-Benachrichtigungsanwendung zu erstellen
[4.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[1.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, Jojo mit LSTM ein seltsames Zitat zu machen
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
Ich habe versucht, mit Go einen exklusiven Kontrollmechanismus zu erstellen
Machen Sie einen Waschtrocknungs-Timer mit Raspberry Pi
Ich habe versucht, "Sakurai-san" LINE BOT mit API Gateway + Lambda zu erstellen
Ich habe versucht, einen URL-Verkürzungsdienst mit AWS CDK serverlos zu machen
Ich möchte eine Webanwendung mit React und Python Flask erstellen
Ich habe versucht, Objekte mit Python und OpenCV zu erkennen
Ich möchte ein Spiel mit Python machen
Ich habe versucht, die Datenbank (sqlite3) mit kivy zu verwenden
Ich habe versucht, einen periodischen Prozess mit CentOS7, Selenium, Python und Chrome durchzuführen
Ich habe eine einfache Mail-Sendeanwendung mit tkinter von Python erstellt
Als ich versuchte, eine VPC mit AWS CDK zu erstellen, konnte ich es aber nicht schaffen
[Patentanalyse] Ich habe versucht, mit Python eine Patentkarte zu erstellen, ohne Geld auszugeben
Ich habe versucht, mit Raspberry Pi 4 eine Umgebung von Ubuntu 20.04 LTS + ROS2 zu erstellen
Ich habe versucht, einen Übersetzungs-BOT zu erstellen, der mit Discord unter Verwendung von Googletrans funktioniert
[Für Anfänger] Ich habe mit Raspberry Pi einen menschlichen Sensor erstellt und LINE benachrichtigt!
Ich habe versucht, Kanas handschriftliche Zeichenerkennung Teil 3/3 Zusammenarbeit mit der GUI mithilfe von Tkinter durchzuführen
Ich habe versucht, eine verdächtige Person mithilfe von Geolonia-Adressdaten schnell zu einem MAP zu machen
Ich habe versucht, eine einfache Bilderkennungs-API mit Fast API und Tensorflow zu erstellen
Ich habe versucht, einen "verdammt großen Literaturkonverter" zu machen.
Erstellen Sie einen Farbsensor mit einem Raspeltorte und einer Kamera
Ich habe versucht, Funktionen mit SIFT von OpenCV zu extrahieren
Ich habe versucht, mit OpenCV Ann Man zu werden
Ich habe versucht, eine OCR-App mit PySimpleGUI zu erstellen
Zeigen Sie das Bild der USB-Kamera mit OpenCV von Python mit Raspeye an