- „Raspberry Pi“ nustatymas naudojant „Buster“ ir „OpenCV“
- „Buzzer“ pridėjimas prie „Raspberry Pi 5Inch“ ekrano
- „Raspberry Pi“ programavimas vaizdo stebėjimo judesio aptikimui
- Judesio aptikimas naudojant „OpenCV“ naudojant „Raspberry Pi“
- Signalo nustatymas judesio aptikimui
- Centrinio procesoriaus temperatūros ir naudojimo stebėjimas
- „Pi CCTV“ judesio detektoriaus paleidimas
„OpenCV“ yra galingas įrankis, kuris kartu su „Raspberry Pi“ gali atverti duris daugeliui nešiojamųjų išmaniųjų įrenginių. Ankstesniame „Raspberry Pi“ vaizdo stebėjimo straipsnyje mes sužinojome, kaip gauti tiesioginį vaizdo stebėjimo vaizdo įrašą iš DVR naudojant RTSP ir rodyti „Raspberry Pi“. Prieš tęsdami, patikrinkite. Šiame straipsnyje mes sužinosime, kaip panaudoti „OpenCV“ galią ir sukurti „ Raspberry Pi“ judesio aptikimo sistemą iš mūsų tiesioginių vaizdo stebėjimo kamerų. Jei neturite įdiegtos vaizdo stebėjimo sistemos, vis tiek galite sukurti „Raspberry Pi“ stebėjimo sistemą, prijungdami USB kameras tiesiai prie savo „Pi“. Ir jei nesate didelis „Pi“ ir „Python“ gerbėjas, galite sukurti kažką panašaus naudodami „ESP32“. Daugiau informacijos rasite ESP32 „Wi-Fi“ durų varpelyje.
Parašysime pitono scenarijų, kuris vienu metu gali stebėti visas keturias vaizdo stebėjimo kameras bet kokiai veiklai (judesiui). Jei bet kurioje kameroje bus aptikta veikla, mūsų „Raspberry Pi“ automatiškai pasikeis į konkretų fotoaparato ekraną ir paryškins, kuri veikla buvo vykdoma, visa tai realiuoju laiku tik su 1,5 sekundės vėlavimu. Taip pat pridėjau aliarmo funkciją, pvz., Garsinį signalą, kuris gali įspėti vartotoją pyptelėdamas, jei aptinkama veikla. Bet jūs galite lengvai tai išplėsti, kad išsiųstumėte pranešimą ar el. Laišką, ar ne! Įdomi teisė! Pradėkime
„Raspberry Pi“ nustatymas naudojant „Buster“ ir „OpenCV“
Aš naudoju „Raspberry Pi 3 B +“ su jame veikiančia „Buster OS“, o „OpenCV“ versija yra 4.1. Jei esate visiškai naujas, vadovaukitės toliau pateiktomis instrukcijomis, kad galėtumėte pradėti.
Tikslas yra, kad jūsų Pi būtų pasirengęs plėtrai. Gerai, kad jūsų Pi turi bet kurią „Raspbian OS“ versiją, tačiau įsitikinkite, kad „OpenCV“ versija yra 4.1 ar naujesnė. Galite sukomplektuoti savo „OpenCV“, kuris užtruks kelias valandas, bet yra patikimesnis sunkiems projektams, arba tiesiog įdiekite jį tiesiogiai iš „pip“ naudodamiesi šiomis komandomis, galite vadovautis aukščiau pateikta instrukcija.
$ pip install opencv-contrib-python == 4.1.0.25
Jei „OpenCV“ su „pip“ diegiate pirmą kartą, turite įdiegti ir kitas priklausomybes. Tam naudokite toliau pateiktas komandas.
$ 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
Mes jau sukūrėme daug „Raspberry Pi OpenCV“ projektų, taip pat galite tai patikrinti, jei norite daugiau įkvėpimo.
„Buzzer“ pridėjimas prie „Raspberry Pi 5Inch“ ekrano
Aparatinės įrangos srityje mes neturime nieko kito, išskyrus 5 colių ekraną ir „Buzzer“. Susiejus 5 colių ekraną su „Raspberry Pi“, galime tiesiogiai pritvirtinti garsinį signalą prie ekrano užpakalinės dalies, kuri mums pratęsė kai kuriuos GPIO kaiščius. Prijungiau savo „Buzzer“, kaip parodyta žemiau-
Jei jus domina naudoti daugiau įvesties / išvesties kaiščių, naudingas žemiau esantis kaiščių aprašymas. Kaip matote tarp išplėstų kaiščių, daugumą kaiščių pats ekranas naudoja jutiklinio ekrano sąsajai. Tačiau vis tiek turime 3,5,7,8,10,11,12,13,15,16 ir 24 kaiščius, kurie neturi ryšio, ir mes galime juos naudoti savo reikmėms. Šioje pamokoje prie GPIO 3 prijungiau garsinį signalą.
„Raspberry Pi“ programavimas vaizdo stebėjimo judesio aptikimui
Visą šio projekto python scenarijų galima rasti šio puslapio apačioje, tačiau aptarkime kiekvieną kodo segmentą, kad suprastume, kaip jis veikia.
Kelių fotoaparatų be atsilikimo stebėjimas naudojant „Raspberry Pi“ naudojant RTSP
Sudėtinga šio darbo dalis buvo sumažinti „Raspberry pi“ apkrovą, kad būtų išvengta perdavimo vėlavimo. Iš pradžių bandžiau perjungti visas keturias kameras ieškodamas judesio, tačiau tai buvo labai vėlu (apie 10 sekundžių). Taigi sujungiau visas keturias kameras į vieną vaizdą ir atlikau visus judesio aptikimo veiksmus. Parašiau dvi funkcijas: sukurti fotoaparatą ir skaityti kamerą.
Sukurti fotoaparatas funkcija naudojama atidaryti kamera su atitinkamo kanalo numerį. Atminkite, kad RTSP URL baigiasi skaičiumi „02“, o tai reiškia, kad aš naudoju vaizdo srautą po srautu, kurio skiriamoji geba bus maža ir todėl jį bus lengviau skaityti. Be to, jūsų naudojamo vaizdo kodeko tipas taip pat prisideda prie greičio. Aš eksperimentavau su skirtingais kodais ir radau, kad FFMPEG yra visų pasninkas.
def create_camera (kanalas): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / channels /" + channel + "02" # pakeisti IP, kad atitiktų tavo dangtelis = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # Pločio ID numeris yra 3 cap.set (4, cam_height) # Aukščio ID numeris 480 cap.set (10, 100) # Ryškumo ID numeris yra 10 grąžinimo dangtelių
Į Skaityti fotoaparato funkcija, mes skaityti visus keturis KAMEROS būtent cam1, CAM2, cam3 ir Cam4 sujungti juos visus į vieną vaizdą, vadinamą Main_screen . Kai šis pagrindinis ekranas bus paruoštas, atliksime visą savo „OpenCV“ darbą dėl šio vaizdo.
def read_camera (): sėkmė, current_screen = cam1.read () Main_screen = current_screen sėkmė, current_screen = cam2.read () Main_screen = current_screen sėkmė, current_screen = cam3.read () Main_screen = current_screen sėkmė, current_screen = cam4.read () Main_screen = dabartinis_screen return (Main_screen)
Pagrindinis ekrano vaizdas su visomis keturiomis kameromis atrodys taip, kaip parodyta žemiau.
Judesio aptikimas naudojant „OpenCV“ naudojant „Raspberry Pi“
Dabar, kai vaizdas yra paruoštas, galime pradėti nuo judesio aptikimo. „ Loop“ viduje mes pradedame skaitydami du skirtingus kadrus, būtent „frame1“ ir „frame2“, tada paversdami juos
frame1 = read_camera () # Perskaitykite pirmąjį kadrą pilkaImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Konvertuoti į pilką frame2 = read_camera () # Perskaitykite 2 kadrą greyImage_F2 = cv2.cvtColor (frame2, cv2.COLOR_)
Tada mes paimame skirtumą tarp šių vaizdų, kad pamatytume, kas pasikeitė, ir nustatydami slenkstį sugrupuojame visas vietas, kurios pasikeitė, tarsi blobas. Taip pat įprasta neryškinti ir išplėsti vaizdą, kad būtų išvengta aštrių kraštų.
diffImage = cv2.absdiff (greyImage_F1, greyImage_F2) # gauti skirtumą - tai kietas blurImage = cv2.GaussianBlur (diffImage, (5,5), 0) _, thresholdImage = cv2.threshold (blurImage, 20,255ES, cv2.T) dilatedImage = cv2.dilate (slenkstisImage, branduolys, iteracijos = 5)
Kitas žingsnis - surasti skaitiklius ir patikrinti kiekvieno skaitiklio plotą, suradę plotą, galime išsiaiškinti, koks didelis judesys. Jei plotas yra didesnis už nurodytą kintamojo „ motion_detected“ vertę , tada mes tai laikome veikla ir brėžiame langelį aplink pakeitimą, kad vartotojas galėtų jį paryškinti.
kontūrai, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find contour yra stebuklinga kontūrų kontūruose funkcija: # kiekvienam aptiktam pakeitimui (x, y, w, h) = cv2.boundingRect (kontūras) #kreipkitės į vietą, kurioje buvo rastas pakeitimas, jei cv2.contourArea (contour)> motion_threshold: cv2.staciakampis (frame1, (x, y), (x + w, y + h), (255, 255, 0), 1) display_screen = rasti_screen ()
Funkcija „ find_screen“ () naudojama norint rasti vietą, kurioje vyko veikla tarp keturių kamerų. Tai galime pastebėti, nes žinome judesio x ir y reikšmes. Palyginame šias x ir y reikšmes su kiekvieno ekrano vieta, norėdami sužinoti, kuris ekranas davė veiklos, ir vėl apkarpome tą konkretų ekraną, kad galėtume jį parodyti jutikliniame pi ekrane.
def find_screen (): if (x <cam_width): if (y <cam_height): screen = frame1 print („Veikla 1 kameros ekrane“) else: screen = frame1 print („Veikla 2 kameros ekrane“) else: jei (y <cam_height): ekranas = frame1 print („Veikla 3 kameros ekrane“) else: screen = frame1 print („Veikla cam 4 ekrane“) grįžimas (ekranas)
Signalo nustatymas judesio aptikimui
Kai žinome, kuriame ekrane aptinkamas judesys, lengva pridėti bet kokio mums reikalingo pavojaus signalo tipą. Čia mes pyptelėjimas švilpukas prijungtas prie GPIO 3. jei pareiškimas patikrinimai, jeigu judesys buvo aptikta ekrane 3 ir žingsniais kintamasis vadinamas trig_alarm . Galite aptikti bet kurį pasirinktą ekraną ar net kelis ekranus.
if ((x> cam_width) ir (y
Jei trig_alarm reikšmė pasieks daugiau nei 3, vieną kartą pypsėsime . Šio skaičiavimo priežastis yra ta, kad kartais pastebėjau šešėlius ar paukščius, sukėlusius netikro pavojaus signalą. Taigi tokiu būdu, jei bus vykdoma nenutrūkstama 3 kadrų veikla, sulauksime aliarmo.
jei (trig_alarm> = 3): # laukite 3 judesių # Laikykite „Buzzer GPIO“ išvestį (BUZZER, 1) time.sleep (0.02) GPIO. output (BUZZER, 0) trig_alarm = 0
Centrinio procesoriaus temperatūros ir naudojimo stebėjimas
Sistema yra įtraukta veikti 24x7, taigi Pi gali labai įkaisti, todėl nusprendžiu stebėti temperatūrą ir procesoriaus naudojimą, rodydamas tas reikšmes ekrane. Šią informaciją gavome naudodami „gpiozero“ biblioteką.
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)
„Pi CCTV“ judesio detektoriaus paleidimas
Aš tai išbandžiau kelias dienas, kad susirinkčiau, ir tai veikia kiekvieną kartą, ir tai buvo tikrai įdomu pastatyti, kol sugadinau vieną fotoaparatą,