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.
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
Informationen zum Installationsverfahren von OpenCV finden Sie im obigen Artikel PC Studio. Python verwendet die bereits enthaltene.
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.
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()
$ sudo python security_cam_motion.py
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.
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.
Der Rand wird in der gespeicherten JPEG-Datei nicht angezeigt.
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.
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)
:
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