- Nastavenie Raspberry Pi pomocou Buster a OpenCV
- Pridanie bzučiaka na 5 palcový displej Raspberry Pi
- Programovanie Raspberry Pi pre CCTV detekciu pohybu
- Detekcia pohybu na OpenCV pomocou Raspberry Pi
- Nastavenie alarmu pre detekciu pohybu
- Monitorovanie teploty a používania procesora
- Spustenie vášho Pi CCTV detektora pohybu
OpenCV je mocný nástroj, ktorý v kombinácii s Raspberry Pi dokáže otvoriť dvere mnohým prenosným inteligentným zariadeniam. V našom predchádzajúcom článku o monitorovaní Raspberry Pi CCTV sme sa naučili, ako získať živé CCTV video z DVR pomocou RTSP a zobraziť ho na Raspberry Pi. Skôr ako budete pokračovať, skontrolujte to. V tomto článku sa dozvieme, ako využiť silu OpenCV a postaviť systém Raspberry Pi Motion Detection na našich živých CCTV záznamoch. Pokiaľ nemáte nainštalovaný CCTV, stále môžete vytvoriť Raspberry Pi Surveillance systém pripojením USB kamier priamo k vášmu Pi. A ak nie ste veľkým fanúšikom Pi a Pythonu, môžete s ESP32 vytvoriť niečo podobné, ďalšie podrobnosti nájdete v časti Zvonkový zvonček ESP32 Wi-Fi.
Napíšeme pythonovský skript, ktorý dokáže monitorovať všetky štyri CCTV kamery súčasne a vykonávať akékoľvek činnosti (pohyb). Ak je na ľubovoľnej kamere zistená aktivita, naša Raspberry Pi sa automaticky zmení na konkrétnu obrazovku kamery a zvýrazní, ktorá aktivita prebehla, a to všetko v reálnom čase s oneskorením iba 1,5 sekundy. Tiež som pridal funkciu alarmu, napríklad bzučiak, ktorý dokáže upozorniť používateľa pípnutím, ak sa zistí aktivita. Môžete to ale ľahko rozšíriť tak, aby ste poslali správu alebo e-mail alebo čo nie! Vzrušujúce právo !! Začnime
Nastavenie Raspberry Pi pomocou Buster a OpenCV
Používam Raspberry Pi 3 B + s operačným systémom Buster OS a verzia OpenCV je 4.1. Ak ste úplne nový, skôr ako začnete, postupujte podľa pokynov uvedených nižšie.
Cieľom je mať svoje Pi pripravené na vývoj. Je v poriadku, že máte na svojom počítači Pi akúkoľvek verziu operačného systému Raspbian, ale uistite sa, že verzia OpenCV je 4.1 alebo vyššia. Môžete postupovať podľa vyššie uvedeného tutoriálu a zostaviť svoj OpenCV, ktorý bude trvať hodiny, ale je spoľahlivejší pre ťažké projekty, alebo ho jednoducho nainštalujete priamo z pipu pomocou nasledujúcich príkazov.
$ pip install opencv-contrib-python == 4.1.0.25
Ak inštalujete OpenCV s pipom prvýkrát, musíte si nainštalovať aj ďalšie závislosti. Použite na to nižšie uvedené prí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 nainštalovať libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
Už sme vytvorili veľa projektov Raspberry Pi OpenCV. Môžete si ich tiež skontrolovať a získať ďalšie inšpirácie.
Pridanie bzučiaka na 5 palcový displej Raspberry Pi
Po hardvérovej stránke nemáme veľa iného ako 5-palcový displej a bzučiak. Po prepojení 5-palcového displeja s Raspberry Pi môžeme priamo namontovať bzučiak na zadnú stranu displeja, ktorý pre nás rozšíril niektoré piny GPIO. Pripojil som svoj bzučiak, ako je znázornené nižšie -
Ak máte záujem o využitie viacerých I / O pinov, bude užitočný nasledujúci popis pinov. Ako môžete vidieť medzi rozšírenými pinmi, väčšinu pinov využíva samotný displej pre rozhranie dotykovej obrazovky. Stále však máme piny 3,5,7,8,10,11,12,13,15,16 a 24, ktoré nemajú žiadne spojenie a môžeme ich použiť pre vlastnú aplikáciu. V tomto tutoriáli som pripojil bzučiak k GPIO 3.
Programovanie Raspberry Pi pre CCTV detekciu pohybu
Celý skript v jazyku Python pre tento projekt nájdete v dolnej časti tejto stránky. Poďme však diskutovať o každom segmente kódu, aby sme pochopili, ako to funguje.
Monitorovanie viacerých kamier bez oneskorenia na Raspberry Pi pomocou RTSP
Náročnou súčasťou tejto práce bolo znížiť zaťaženie Raspberry pi, aby sa zabránilo oneskoreniu v streamovaní. Spočiatku som skúšal prepínať medzi všetkými štyrmi kamerami, aby som vyhľadal pohyb, ale bolo to veľmi oneskorené (asi 10 sekúnd). Spojil som teda všetky štyri kamery do jedného obrázka a urobil som na ňom všetky činnosti detekcie pohybu. Napísal som dve funkcie, a to vytvoriť fotoaparát a prečítať fotoaparát.
Funkcia vytvorenia kamery sa používa na otvorenie kamery s príslušným číslom kanálu. Upozorňujeme, že adresa URL RTSP končí číslicou „02“, čo znamená, že používam zdroj videa pod prúdom, ktorý bude mať nízke rozlíšenie a teda bude rýchlejšie načítaný. K rýchlosti prispieva aj typ použitého videokodeku, ktorý som použil, experimentoval som s rôznymi kódmi a zistil som, že FFMPEG je pôstom všetkých.
def create_camera (channel): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / channels /" + channel + "02" #zmeňte IP tak, aby vyhovovalo tvoj cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # identifikačné číslo pre šírku je 3 cap.set (4, cam_height) # identifikačné číslo pre výšku je 480 cap.set (10, 100) # ID číslo pre jas je 10 návratových čiap
Vo funkcii načítania kamery prečítame všetky štyri kamery, konkrétne cam1, cam2, cam3 a cam4, aby sme ich všetky spojili do jedného obrázka s názvom Main_screen . Keď bude táto hlavná obrazovka pripravená, urobíme na tomto obrázku všetku našu prácu OpenCV.
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)
Obrázok na hlavnej obrazovke so všetkými štyrmi kombinovanými vačkami bude vyzerať ako na obrázku nižšie.
Detekcia pohybu na OpenCV pomocou Raspberry Pi
Teraz, keď máme obraz pripravený, môžeme začať s našou detekciou pohybu. Vo vnútri while cyklu začneme čítaním dvoch rôznych rámcov, a to frame1 a frame2, potom ich prevedieme do stupňov šedej
frame1 = read_camera () # Prečítajte si prvý rámček greyImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Preveďte na sivý rámik2 = read_camera () # Prečítajte si 2. rámček greyImage_F2 = cv2.cvtColor (frame2, cv2.COR2_OL
Potom urobíme rozdiel medzi oboma týmito obrázkami, aby sme zistili, čo sa zmenilo, a s prahovou hodnotou zoskupíme všetky miesta, ktoré sa zmenili, niečo ako škvrna. Bežné je tiež rozmazanie a rozšírenie obrazu, aby sa zabránilo ostrým hranám.
diffImage = cv2.absdiff (grayImage_F1, grayImage_F2) #získať rozdiel - 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)
Ďalším krokom je nájsť počítadlá a skontrolovať plochu každého počítadla. Nájdením oblasti môžeme zistiť, aký veľký je pohyb. Ak je oblasť väčšia ako zadaná hodnota v premennej motion_detected , potom to považujeme za aktivitu a okolo zmeny nakreslíme rámček, ktorý ju zvýrazní pre používateľa.
kontúry, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find contour je magická funkcia pre kontúry v obrysoch: # pre každú zistenú zmenu (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 ()
Funkcia find_screen () slúži na zistenie miesta, kde k aktivite došlo medzi štyrmi kamerami. Môžeme to zistiť, pretože poznáme hodnoty xay pohybu. Porovnáme tieto hodnoty x a y s umiestnením každej obrazovky, aby sme zistili, ktorá obrazovka poskytla aktivitu, a znova orezáme túto konkrétnu obrazovku, aby sme ju mohli zobraziť na dotykovej obrazovke 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 = tlač na rámček 1 ("Aktivita na vačkovej obrazovke 3") else: screen = rámček na tlač ("Aktivita na vačkovej obrazovke 4")
Nastavenie alarmu pre detekciu pohybu
Keď vieme, na ktorej obrazovke je detekovaný pohyb, je ľahké pridať akýkoľvek typ alarmu, ktorý potrebujeme. Tu pípneme bzučiak pripojený k GPIO 3. Príkaz if skontroluje, či bol pohyb detekovaný na obrazovke 3, a zvýši premennú nazvanú trig_alarm . Môžete detekovať ľubovoľnú obrazovku podľa vášho výberu alebo dokonca na viacerých obrazovkách.
if ((x> cam_width) a (y
Ak hodnota trig_alarm dosiahne viac ako 3, raz pípneme bzučiak. Dôvod tohto počtu je, že som si niekedy všimol, že tiene alebo vtáky vyvolávajú falošný poplach. Takto teda iba v prípade, že existuje nepretržitá aktivita pre 3 snímky, dostaneme alarm.
if (trig_alarm> = 3): # počkajte na 3 pohyby # pípnite Buzzer GPIO.output (BUZZER, 1) time.sleep (0,02) GPIO.output (BUZZER, 0) trig_alarm = 0
Monitorovanie teploty a používania procesora
Systém je odsadený tak, aby fungoval nepretržite, a preto sa Pi môže veľmi zahriať, takže sa rozhodujem sledovať teplotu a využitie procesora zobrazením týchto hodnôt na obrazovke. Tieto informácie sme získali pomocou knižnice 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)
Spustenie vášho Pi CCTV detektora pohybu
Testoval som to niekoľko dní, aby som sa zhromaždil, a funguje to vždy, a bolo to naozaj zábavné zostavenie, kým som nepoškodil jednu kameru,