- Raspberry Pi instellen met Buster en OpenCV
- Zoemer toevoegen aan Raspberry Pi 5 Inch Display
- Raspberry Pi programmeren voor CCTV-bewegingsdetectie
- Bewegingsdetectie op OpenCV met Raspberry Pi
- Alarm instellen voor bewegingsdetectie
- Bewaken van CPU-temperatuur en gebruik
- Start uw Pi CCTV-bewegingsdetector
OpenCV is een krachtig hulpmiddel en dat in combinatie met Raspberry Pi kan deuren openen voor veel draagbare slimme apparaten. In ons vorige Raspberry Pi CCTV-bewakingsartikel hebben we geleerd hoe we live CCTV-video van een DVR kunnen krijgen met behulp van RTSP en weergeven op een Raspberry Pi, controleer dat voordat u verder gaat. In dit artikel zullen we leren hoe we de kracht van OpenCV kunnen benutten en een Raspberry Pi-bewegingsdetectiesysteem kunnen bouwen op onze live CCTV-footages. Als je geen CCTV hebt geïnstalleerd, kun je nog steeds een Raspberry Pi Surveillance-systeem bouwen door USB-camera's rechtstreeks op je Pi aan te sluiten. En als je geen grote fan bent van Pi en Python, kun je iets soortgelijks bouwen met ESP32, raadpleeg ESP32 Wi-Fi Door Bell voor meer details.
We zullen een python-script schrijven dat alle vier de CCTV-camera's tegelijkertijd kan controleren op activiteiten (beweging). Als een activiteit op een camera wordt gedetecteerd, zal onze Raspberry Pi automatisch naar dat specifieke camerascherm overschakelen en aangeven welke activiteit heeft plaatsgevonden, dit alles in realtime met slechts 1,5 seconde vertraging. Ik heb ook een alarmfunctie toegevoegd, zoals een zoemer die de gebruiker kan waarschuwen door te piepen als er een activiteit wordt gedetecteerd. Maar je kunt dit eenvoudig opschalen om een bericht of e-mail te sturen of wat niet! Spannend toch !! Laten we beginnen
Raspberry Pi instellen met Buster en OpenCV
Ik gebruik de Raspberry Pi 3 B + met Buster OS erop en de versie van OpenCV is 4.1. Als je helemaal nieuw bent, volg dan onderstaande tutorials voordat je aan de slag kunt.
Het doel is om je Pi klaar te hebben voor ontwikkeling. Het is prima om een versie van Raspbian OS op je Pi te hebben, maar zorg ervoor dat de versie van OpenCV 4.1 of hoger is. U kunt de bovenstaande tutorial volgen om uw OpenCV te compileren, wat uren duurt maar betrouwbaarder is voor zware projecten, of u kunt het rechtstreeks vanuit pip installeren met behulp van de volgende opdrachten.
$ pip install opencv-contrib-python == 4.1.0.25
Als u OpenCV voor het eerst met pip installeert, moet u ook de andere afhankelijkheden installeren. Gebruik daarvoor de onderstaande commando's.
$ 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
We hebben al veel Raspberry Pi OpenCV-projecten gebouwd, je kunt dat ook bekijken voor meer inspiratie.
Zoemer toevoegen aan Raspberry Pi 5 Inch Display
Aan de hardwarezijde hebben we niet veel anders dan een 5-inch display en een zoemer. Na het koppelen van het 5-inch scherm met de Raspberry Pi, kunnen we de zoemer direct aan de achterkant van het scherm monteren, dat enkele GPIO-pinnen voor ons heeft verlengd. Ik heb mijn zoemer aangesloten zoals hieronder getoond-
Als u meer I / O-pinnen wilt gebruiken, is de onderstaande pinbeschrijving handig. Zoals je kunt zien tussen de verlengde pinnen, worden de meeste pinnen door het scherm zelf gebruikt voor een touchscreen-interface. Maar toch, we hebben pinnen 3,5,7,8,10,11,12,13,15,16, en 24 die geen verbinding hebben en we kunnen het gebruiken voor onze eigen toepassing. In deze tutorial heb ik een zoemer aangesloten op GPIO 3.
Raspberry Pi programmeren voor CCTV-bewegingsdetectie
Het volledige python-script voor dit project is onderaan deze pagina te vinden, maar laten we elk segment van de code bespreken om te begrijpen hoe het werkt.
Meerdere camera's bewaken zonder vertraging op Raspberry Pi met behulp van RTSP
De uitdaging bij het maken van dit werk was om de belasting van Raspberry pi te verminderen om vertraging bij het streamen te voorkomen. Aanvankelijk probeerde ik tussen alle vier de camera's te schakelen om beweging te zoeken, maar het was erg traag (ongeveer 10 seconden). Dus ik combineerde alle vier de camera's tot één beeld en deed alle bewegingsdetectie-activiteiten op dat beeld. Ik heb twee functies geschreven, namelijk een camera maken en camera lezen.
De functie camera maken wordt gebruikt om de camera te openen met het bijbehorende kanaalnummer. Merk op dat de RTSP-URL eindigt op "02", wat betekent dat ik de videofeed van de substream gebruik die een lage resolutie heeft en dus sneller te lezen is. Ook draagt het type videocodec dat je gebruikt ook bij aan de snelheid. Ik heb geëxperimenteerd met verschillende codes en ontdekte dat FFMPEG de snelste van allemaal was.
def create_camera (kanaal): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / kanalen /" + kanaal + "02" # verander het IP naar wens jouwe cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # ID-nummer voor breedte is 3 cap.set (4, cam_height) # ID-nummer voor hoogte is 480 cap.set (10, 100) # ID-nummer voor helderheid is 10 retourkap
In de lees- camera functioneert, zullen wij alle vier cams gelezen namelijk cam1, CAM2, CAM3 en cam4 om ze allemaal te combineren tot een enkel beeld genoemd Main_screen . Zodra dit hoofdscherm klaar is, zullen we al ons OpenCV-werk aan deze afbeelding doen.
def read_camera (): success, current_screen = cam1.read () Main_screen = current_screen succes, current_screen = cam2.read () Main_screen = current_screen succes, current_screen = cam3.read () Main_screen = current_screen succes, current_screen = cam4.read () Main_screen = current_screen return (Main_screen)
De afbeelding op het hoofdscherm met alle vier de camera's gecombineerd ziet eruit als de onderstaande afbeelding.
Bewegingsdetectie op OpenCV met Raspberry Pi
Nu we het beeld klaar hebben, kunnen we beginnen met onze bewegingsdetectie. Binnen de while-lus beginnen we met het lezen van twee verschillende frames, namelijk frame1 en frame2, en converteren ze vervolgens naar grijswaarden
frame1 = read_camera () #Lees het eerste frame grayImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Converteren naar grijs frame2 = read_camera () #Lees het tweede frame grayImage_F2 = cv2.cvtColor (frame2, cv2.COLOR_B)
Vervolgens nemen we een verschil tussen beide afbeeldingen om te zien wat er is veranderd en met een drempel groeperen we alle plaatsen die een verandering hebben ondergaan, een beetje als een klodder. Het is ook gebruikelijk om het beeld te vervagen en te verwijden om scherpe randen te voorkomen.
diffImage = cv2.absdiff (greyImage_F1, greyImage_F2) #get the differentance - dit is cool blurImage = cv2.GaussianBlur (diffImage, (5,5), 0) _, thresholdImage = cv2.threshold (blurImage, 20,255, cv2.THRESH_BINARY) dilatedImage = cv2.dilate (thresholdImage, kernal, iteraties = 5)
De volgende stap is om tellers te vinden en de oppervlakte van elke teller te controleren, door het gebied te vinden, kunnen we erachter komen hoe groot de beweging is. Als het gebied groter is dan een gespecificeerde waarde in de variabele motion_detected , dan beschouwen we dat als een activiteit en tekenen we een kader rond de wijziging om deze voor de gebruiker te markeren.
contouren, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find contour is een magische functie voor contour in contouren: #voor elke verandering die wordt gedetecteerd (x, y, w, h) = cv2.boundingRect (contour) # verkrijg de locatie waar verandering werd gevonden als cv2.contourArea (contour)> motion_threshold: cv2.rectangle (frame1, (x, y), (x + w, y + h), (255, 255, 0), 1) display_screen = find_screen ()
De functie find_screen () wordt gebruikt om te zoeken waar de activiteit plaatsvond tussen de vier camera's. We kunnen dat vinden omdat we de x- en y-waarden van de beweging kennen. We vergelijken deze x- en y-waarden met de locatie van elk scherm om te zien welk scherm activiteit gaf en we snijden dat specifieke scherm opnieuw bij, zodat we het op het pi-aanraakscherm kunnen weergeven.
def find_screen (): if (x <cam_width): if (y <cam_height): screen = frame1 print ("Activiteit in cam scherm 1") else: screen = frame1 print ("Activiteit in cam scherm 2") else: if (y <cam_height): screen = frame1 print ("Activiteit in cam scherm 3") else: screen = frame1 print ("Activiteit in cam scherm 4") return (scherm)
Alarm instellen voor bewegingsdetectie
Zodra we weten op welk scherm beweging wordt gedetecteerd, is het eenvoudig om elk type alarm toe te voegen dat we nodig hebben. Hier zullen we een zoemer laten klinken die is verbonden met GPIO 3. De if- instructie controleert of de beweging werd gedetecteerd in scherm 3 en verhoogt een variabele genaamd trig_alarm . U kunt elk scherm naar keuze detecteren of zelfs op meerdere schermen.
if ((x> cam_width) en (y
Als de waarde van trig_alarm meer dan 3 bereikt, piepen we eenmaal een zoemer. De reden voor deze telling is dat ik soms schaduwen zag of vogels een nepalarm veroorzaakten. Dus alleen op deze manier als er een continue activiteit is gedurende 3 frames, krijgen we een alarm.
if (trig_alarm> = 3): # wacht op conts 3 bewegingen #Beep the Buzzer GPIO.output (BUZZER, 1) time.sleep (0.02) GPIO.output (BUZZER, 0) trig_alarm = 0
Bewaken van CPU-temperatuur en gebruik
Het systeem is ingesprongen om 24x7 te werken en daarom kan de Pi erg heet worden, dus ik besluit om de temperatuur en het CPU-gebruik te controleren door die waarden op het scherm weer te geven. We hebben deze informatie verkregen met behulp van de gpiozero-bibliotheek.
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)
Start uw Pi CCTV-bewegingsdetector
Ik heb dit dagenlang getest om te verzamelen en het werkt elke keer en het was echt een leuke build totdat ik een camera beschadigde,