- Nastavení Raspberry Pi pomocí Buster a OpenCV
- Přidání bzučáku na 5palcový displej Raspberry Pi
- Programování Raspberry Pi pro detekci pohybu CCTV
- Detekce pohybu na OpenCV pomocí Raspberry Pi
- Nastavení alarmu pro detekci pohybu
- Monitorování teploty a využití CPU
- Spuštění vašeho detektoru pohybu CCTV Pi
OpenCV je výkonný nástroj, který v kombinaci s Raspberry Pi může otevřít dveře mnoha přenosným chytrým zařízením. V našem předchozím článku o monitorování CCTV Raspberry Pi jsme se naučili, jak získat živé CCTV video z DVR pomocí RTSP a zobrazit na Raspberry Pi, než to budete pokračovat, zkontrolujte to. V tomto článku se naučíme, jak využít sílu OpenCV a vytvořit systém Raspberry Pi Motion Detection na našich živých CCTV záznamech. Pokud nemáte nainstalovaný CCTV, stále můžete vytvořit Raspberry Pi Surveillance systém připojením USB kamer přímo k vašemu Pi. A pokud nejste velkým fanouškem Pi a Pythonu, můžete vytvořit něco podobného s ESP32, další podrobnosti najdete v ESP32 Wi-Fi Door Bell.
Napíšeme pythonovský skript, který dokáže monitorovat všechny čtyři CCTV kamery současně na jakékoli činnosti (pohyb). Pokud je na jakékoli kameře detekována aktivita, naše Raspberry Pi se automaticky změní na konkrétní obrazovku kamery a zvýrazní, která aktivita proběhla, to vše v reálném čase s prodlevou pouhých 1,5 sekundy. Také jsem přidal funkci alarmu, jako je bzučák, který může uživatele upozornit pípnutím, pokud je detekována aktivita. Ale můžete to snadno škálovat a poslat zprávu nebo e-mail nebo co ne! Vzrušující právo !! Začněme
Nastavení Raspberry Pi pomocí Buster a OpenCV
Používám Raspberry Pi 3 B + s běžícím operačním systémem Buster a verze OpenCV je 4.1. Pokud jste úplně noví, postupujte podle pokynů níže, než začnete.
Cílem je mít vaše Pi připravené k vývoji. Je v pořádku mít na svém Pi jakoukoli verzi Raspbian OS, ale ujistěte se, že verze OpenCV je 4.1 nebo vyšší. Můžete buď postupovat podle výše uvedeného tutoriálu a zkompilovat váš OpenCV, který bude trvat hodiny, ale je spolehlivější pro těžké projekty, nebo ho jednoduše nainstalujte přímo z pipu pomocí následujících příkazů.
$ pip install opencv-contrib-python == 4.1.0.25
Pokud instalujete OpenCV s pipem poprvé, musíte nainstalovat také další závislosti. K tomu použijte níže uvedené příkazy.
$ 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 instalace libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
Již jsme postavili mnoho projektů Raspberry Pi OpenCV, můžete si to také ověřit a získat další inspirace.
Přidání bzučáku na 5palcový displej Raspberry Pi
Po hardwarové stránce nemáme nic jiného než 5palcový displej a bzučák. Po propojení 5palcového displeje s Raspberry Pi můžeme přímo připojit bzučák na zadní stranu displeje, který pro nás rozšířil některé piny GPIO. Připojil jsem svůj bzučák, jak je uvedeno níže -
Pokud máte zájem o využití více I / O pinů, bude užitečný níže uvedený popis pinů. Jak můžete vidět mezi rozšířenými kolíky, většinu kolíků využívá samotný displej pro rozhraní dotykové obrazovky. Ale přesto máme piny 3,5,7,8,10,11,12,13,15,16 a 24, které nemají žádné připojení a můžeme je použít pro vlastní aplikaci. V tomto tutoriálu jsem připojil bzučák k GPIO 3.
Programování Raspberry Pi pro detekci pohybu CCTV
Celý pythonovský skript pro tento projekt najdete ve spodní části této stránky, ale pojďme diskutovat o každém segmentu kódu, abychom pochopili, jak to funguje.
Monitorování více kamer bez zpoždění na Raspberry Pi pomocí RTSP
Náročnou součástí této práce bylo snížit zátěž Raspberry pi, aby se zabránilo zpoždění ve streamování. Zpočátku jsem zkoušel přepínat mezi všemi čtyřmi kamerami, abych hledal pohyb, ale bylo to velmi zaostalé (asi 10 sekund). Zkombinoval jsem tedy všechny čtyři kamery do jednoho obrazu a provedl všechny činnosti detekce pohybu na tomto obrázku. Napsal jsem dvě funkce, a to vytvořit kameru a číst kameru.
Funkce vytvoření kamery se používá k otevření kamery s příslušným číslem kanálu. Všimněte si, že URL RTSP končí číslicí „02“, což znamená, že používám podřízený videopřenos, který bude mít nízké rozlišení a tudíž rychlejší čtení. Také typ použitého video kodeku také přispívá k rychlosti, experimentoval jsem s různými kódy a zjistil jsem, že FFMPEG je ze všech nalačno.
def create_camera (channel): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / channels /" + channel + "02" # změnit IP tak, aby vyhovovalo your cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # ID číslo pro šířku je 3 cap.set (4, cam_height) # ID číslo pro výšku je 480 cap.set (10, 100) # ID číslo pro jas je 10 návratových čepic
Ve funkci čtení kamery budeme číst všechny čtyři kamery, jmenovitě cam1, cam2, cam3 a cam4, abychom je všechny spojili do jednoho obrazu s názvem Main_screen . Jakmile bude tato hlavní obrazovka připravena, provedeme veškerou naši práci OpenCV na tomto obrázku.
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)
Obraz na hlavní obrazovce se všemi čtyřmi kombinovanými vačkami bude vypadat jako na obrázku níže.
Detekce pohybu na OpenCV pomocí Raspberry Pi
Nyní, když máme obraz připravený, můžeme začít s naší detekcí pohybu. Uvnitř smyčky while začneme čtením dvou různých snímků, a to frame1 a frame2, poté je převedeme na stupně šedi
frame1 = read_camera () # Číst první snímek greyImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Převést na šedý frame2 = read_camera () # Přečíst druhý snímek greymage_F2 = cv2.cvtColor (frame2, cv2.COR2_OL
Pak vezmeme rozdíl mezi oběma těmito obrázky, abychom zjistili, co se změnilo, as prahovou hodnotou seskupíme všechna místa, která měla změnu, něco jako blob. Je také běžné obraz rozmazat a roztáhnout, aby nedocházelo k ostrým hranám.
diffImage = cv2.absdiff (grayImage_F1, greyImage_F2) # získejte rozdíl - to je cool blurImage = cv2.GaussianBlur (diffImage, (5,5), 0) _, thresholdImage = cv2.threshold (blurImage, 20 255, cv2.THRESH_B) dilatedImage = cv2.dilate (thresholdImage, kernal, iterations = 5)
Dalším krokem je najít čítače a zkontrolovat plochu každého počítadla. Vyhledáním oblasti můžeme zjistit, jak velký je pohyb. Pokud je oblast větší než zadaná hodnota v proměnné motion_detected , považujeme to za aktivitu a nakreslíme kolem změny rámeček, který ji zvýrazní uživateli.
kontury, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find contour je kouzelná funkce pro kontury v obrysech: # pro každou detekovanou změnu (x, y, w, h) = cv2.boundingRect (contour) #get the location where change was found if cv2.contourArea (contour)> motion_threshold: cv2.rectangle (frame1, (x, y), (x + w, y + h), (255, 255, 0), 1) display_screen = find_screen ()
Funkce find_screen () slouží k vyhledání místa, kde k aktivitě došlo mezi čtyřmi kamerami. Můžeme to zjistit, protože známe hodnoty xay pohybu. Porovnáme tyto hodnoty x a y s umístěním každé obrazovky, abychom zjistili, která obrazovka poskytla aktivitu, a znovu ořízneme tuto konkrétní obrazovku, abychom ji mohli zobrazit na dotykové obrazovce pi.
def find_screen (): if (x <cam_width): if (y <cam_height): screen = frame1 print ("Activity in cam screen 1") else: screen = frame1 print ("Activity in cam screen 2") else: if (y <cam_height): obrazovka = tisk rámečku 1 ("Aktivita na obrazovce vačky 3") else: obrazovka = snímek 1 tisku ("Aktivita na obrazovce kamery 4") návrat (obrazovka)
Nastavení alarmu pro detekci pohybu
Jakmile víme, na které obrazovce je detekován pohyb, je snadné přidat jakýkoli typ alarmu, který potřebujeme. Zde zapípáme bzučák připojený k GPIO 3. Příkaz if zkontroluje, zda byl pohyb detekován na obrazovce 3, a zvýší proměnnou nazvanou trig_alarm . Můžete detekovat libovolnou obrazovku podle vašeho výběru nebo dokonce na více obrazovkách.
if ((x> cam_width) a (y
Pokud hodnota trig_alarm dosáhne více než 3, jednou zapípáme bzučák. Důvodem tohoto počtu je, že jsem si někdy všiml, že stíny nebo ptáci vyvolali falešný poplach. Takže tímto způsobem, pouze pokud existuje nepřetržitá aktivita pro 3 snímky, dostaneme poplach.
if (trig_alarm> = 3): # počkejte na 3 pohyby # Bee the Buzzer GPIO.output (BUZZER, 1) time.sleep (0.02) GPIO.output (BUZZER, 0) trig_alarm = 0
Monitorování teploty a využití CPU
Systém je odsazen tak, aby fungoval 24x7, a proto se Pi může velmi zahřát, takže jsem se rozhodl sledovat teplotu a využití procesoru zobrazením těchto hodnot na obrazovce. Tyto informace jsme získali pomocí knihovny gpiozero.
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)
Spuštění vašeho detektoru pohybu CCTV Pi
Testoval jsem to několik dní, abych se shromáždil, a funguje to pokaždé a bylo to opravdu zábavné sestavení, dokud jsem nepoškodil jednu kameru,