- Raspberry Pi: n asentaminen Busterilla ja OpenCV: llä
- Summerin lisääminen Vadelma Pi 5 tuuman näyttöön
- Raspberry Pi -ohjelmointi CCTV-liiketunnistusta varten
- Liiketunnistus OpenCV: llä Raspberry Pi: n avulla
- Hälytyksen asettaminen liiketunnistusta varten
- Suorittimen lämpötilan ja käytön seuranta
- Pi CCTV -liikkeentunnistimen käynnistäminen
OpenCV on tehokas työkalu, joka yhdessä Raspberry Pi: n kanssa voi avata ovia monille kannettaville älylaitteille. Edellisessä Raspberry Pi CCTV -seurantaartikkelissamme opimme, kuinka saada suoraa CCTV-videota DVR: ltä RTSP: n avulla ja näyttää Raspberry Pi: llä, tarkista se ennen jatkamista. Tässä artikkelissa opimme käyttämään OpenCV: n tehoa ja rakentamaan Raspberry Pi -liikkeentunnistusjärjestelmän live-CCTV-kuvamateriaaleihimme. Jos sinulla ei ole CCTV: tä asennettuna, voit silti rakentaa Raspberry Pi -valvontajärjestelmän liittämällä USB-kamerat suoraan Pi-laitteeseesi. Ja jos et ole suuri Pi: n ja Pythonin fani, voit rakentaa jotain vastaavaa ESP32: lla, katso lisätietoja ESP32: n Wi-Fi-ovikellosta.
Kirjoitamme python-komentosarjan, joka voi valvoa kaikkia neljää CCTV-kameraa samanaikaisesti minkä tahansa toiminnan (liikkeen) varalta. Jos aktiviteetti havaitaan missä tahansa kamerassa, Raspberry Pi vaihtaa automaattisesti kyseiselle kameran näytölle ja korostaa tapahtuneen toiminnan, reaaliajassa vain 1,5 sekunnin viiveellä. Olen myös lisännyt hälytysominaisuuden, kuten summerin, joka voi varoittaa käyttäjää piippaamalla, jos aktiviteetti havaitaan. Mutta voit helposti laajentaa tätä lähettämään viestin tai sähköpostin tai mitä ei! Jännittävä oikea! Aloitetaan
Raspberry Pi: n asentaminen Busterilla ja OpenCV: llä
Käytän Raspberry Pi 3 B + -sovellusta, jossa on käynnissä Buster OS ja OpenCV-versio on 4.1. Jos olet täysin uusi, seuraa alla olevia oppaita, ennen kuin pääset alkuun.
Tavoitteena on, että Pi on valmiina kehittämiseen. On hyvä, että Pi: lläsi on jokin Raspbian OS -versio, mutta varmista, että OpenCV-versio on 4.1 tai uudempi. Voit joko kääntää yllä olevaa opetusohjelmaa kääntääksesi OpenCV: n, joka kestää tunteja, mutta on luotettavampi raskaissa projekteissa, tai asenna se suoraan pipistä seuraavien komentojen avulla.
$ pip install opencv-contrib-python == 4.1.0.25
Jos asennat OpenCV: n pip: llä ensimmäistä kertaa, sinun on asennettava myös muut riippuvuudet. Käytä siihen alla olevia komentoja.
$ 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
Olemme jo rakentaneet monia Raspberry Pi OpenCV -projekteja, voit myös tarkistaa siitä lisää inspiraatioita.
Summerin lisääminen Vadelma Pi 5 tuuman näyttöön
Laitteistopuolella meillä ei ole paljon muuta kuin 5 tuuman näyttö ja summeri. Viiden tuuman näytön ja Raspberry Pi: n yhdistämisen jälkeen voimme kiinnittää summerin suoraan näytön takaosaan, joka on laajentanut joitain GPIO-nastoja meille. Olen liittänyt summerin alla olevan kuvan mukaisesti-
Jos olet kiinnostunut käyttämään enemmän I / O-nastoja, alla oleva nastojen kuvaus on hyödyllinen. Kuten voit nähdä laajennetuista nastoista, näyttö itse käyttää suurinta osaa nastoista kosketusnäyttöliitäntään. Mutta silti meillä on nastoja 3,5,7,8,10,11,12,13,15,16 ja 24, joilla ei ole yhteyttä, ja voimme käyttää sitä omaan sovellukseemme. Tässä opetusohjelmassa olen liittänyt summerin GPIO 3: een.
Raspberry Pi -ohjelmointi CCTV-liiketunnistusta varten
Tämän projektin täydellinen python-komentosarja löytyy tämän sivun alaosasta, mutta keskustellaan koodin jokaisesta segmentistä ymmärtämään, miten se toimii.
Useiden kameroiden seuranta ilman viivettä Raspberry Pi: llä RTSP: n avulla
Haastava osa tämän työn tekemisessä oli vähentää Vadelma pi: n kuormitusta suoratoiston viiveen välttämiseksi. Aluksi yritin vaihtaa kaikkien neljän kameran välillä etsiäksesi liikettä, mutta se oli hyvin viivästynyt (noin 10 sekuntia). Joten yhdistin kaikki neljä kameraa yhdeksi kuvaksi ja tein kaikki liikkeen havaitsevat toiminnot tälle kuvalle. Kirjoitin kaksi toimintoa, nimittäin kameran luominen ja kameran lukeminen.
Luoda kamera toimintoa käytetään avaamaan nokka sen kulloisenkin kanavan numero. Huomaa, että RTSP-URL päättyy numeroon 02, mikä tarkoittaa, että käytän alivirran videosyöttöä, jonka resoluutio on pieni ja siten nopeampi lukea. Myös käyttämäsi videokoodekin tyyppi lisää nopeutta, kokeilin erilaisia koodeja ja huomasin, että FFMPEG on kaikkien paasto.
def create_camera (kanava): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / kanavat /" + channel + "02" #vaihda IP sopivaksi sinun cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # ID-numero leveydelle on 3 cap.set (4, cam_height) # Korkeuden ID-numero on 480 cap.set (10, 100) # Kirkkauden tunnusnumero on 10 paluukorkkia
Vuonna lukea kameran toiminto, luemme kaikki neljä kamerat eli CAM1, CAM2, CAM3 ja Cam4 yhdistää ne kaikki yhdeksi kuvaksi kutsutaan Main_screen . Kun tämä päänäyttö on valmis, teemme kaiken OpenCV-työmme tämän kuvan kanssa.
def read_camera (): menestys, nykyinen_näyttö = cam1.read () Main_screen = nykyinen_screen paluu (Main_screen)
Päänäytön kuva, jossa on kaikki neljä kameraa, näyttää alla olevalta.
Liiketunnistus OpenCV: llä Raspberry Pi: n avulla
Nyt kun kuva on valmis, voimme aloittaa liikkeentunnistuksella. While- silmukan sisällä aloitetaan lukemalla kaksi erilaista kehystä eli kehys1 ja kehys2, sitten muuntamalla ne harmaasävyiksi
frame1 = read_camera () #Lue ensimmäinen kehys harmaaImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Muunna harmaaksi frame2 = read_camera () #Lue 2. kehys greyImage_F2 = cv2.cvtColor (frame2, cv2COLOR_)
Sitten otamme eron näiden kahden kuvan välillä nähdäksesi, mikä on muuttunut, ja kynnyksellä ryhmittelemme kaikki paikat, joissa oli muutos, ikään kuin möykky. On myös tavallista hämärtää ja laajentaa kuvaa terävien reunojen välttämiseksi.
diffImage = cv2.absdiff (harmaaImage_F1, harmaaImage_F2) #hake eroa - tämä on siisti hämärtääImage = cv2.GaussianBlur (diffImage, (5,5), 0) _, kynnysarvoImage = cv2.threshold (blurImage, 20,255ES, cv2.T) dilatedImage = cv2.dilate (kynnyskuva, ytimen, iteraatiot = 5)
Seuraava askel on löytää laskurit ja tarkistaa jokaisen laskurin alue, löytämällä alue, voimme selvittää, kuinka suuri liike. Jos alue on suurempi kuin määritetty arvo muuttujassa motion_detected , pidämme sitä toimintana ja piirrämme muutoksen ympärille ruudun korostaaksesi sen käyttäjälle.
ääriviivat, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find contour on taikafunktio ääriviivojen ääriviivoille: # jokaisesta havaitusta muutoksesta (x, y, w, h) = cv2.boundingRect (ääriviiva) #määritä sijainti, josta muutos löydettiin, jos cv2.contourArea (contour)> motion_threshold: cv2.suorakulmio (kehys1, (x, y), (x + w, y + h), (255, 255, 0), 1) display_screen = etsi_screen ()
Funktiota find_screen () käytetään etsimään toimintoa neljän kameran joukossa. Voimme huomata, että koska tiedämme liikkeen x- ja y-arvot. Verrataan näitä x- ja y-arvoja kunkin näytön sijaintiin löytääkseen mikä näyttö antoi aktiviteettia, ja rajaamme uudelleen kyseisen näytön, jotta voimme näyttää sen pi-kosketusnäytöllä.
def find_screen (): if (x <cam_width): if (y <cam_height): screen = kehys1 tulosta ("Activity in cam screen 1") else: screen = frame1 print ("Activity in cam screen 2") else: if (y <cam_height): ruutu = kehys1 tulosta ("Toiminto nokanäytössä 3") muut: näyttö = kehys1 tulosta ("Toiminta nokanäytössä 4") palaa (näyttö)
Hälytyksen asettaminen liiketunnistusta varten
Kun tiedämme, missä näytössä liike havaitaan, on helppo lisätä minkä tahansa tyyppinen hälytys, jota tarvitsemme. Täällä me piippaa summeri kytkettynä GPIO 3. jos selvitys tarkistaa, onko liikettä havaittiin näytön 3 ja lisäyksin muuttuja nimeltään trig_alarm . Voit tunnistaa minkä tahansa valitsemasi näytön tai jopa useista näytöistä.
jos ((x> nokan leveys) ja (y
Jos trig_alarm- arvon arvo ylittää 3, äänimerkki kuuluu kerran. Syy tähän laskemiseen on, että joskus huomasin varjojen tai lintujen aiheuttaneen väärennöksen. Joten tällä tavalla vain, jos 3 kehykselle on jatkuva toiminta, saamme hälytyksen.
jos (trig_alarm> = 3): # odota 3 liikettä #Pidä summeri GPIO-lähtö (BUZZER, 1) time.sleep (0.02) GPIO-lähtö (BUZZER, 0) trig_alarm = 0
Suorittimen lämpötilan ja käytön seuranta
Järjestelmä on sisennetty toimimaan 24x7, joten Pi voi lämmetä hyvin, joten päätän seurata lämpötilaa ja suorittimen käyttöä näyttämällä nämä arvot näytöllä. Olemme saaneet nämä tiedot gpiozero-kirjastosta.
cpu = CPUTemperature () load = LoadAverage () cpu_temperature = str ((cpu.temperature) // 1) load_avigation = str (load.load_average) #print (cpu.temperature) #print (load.load_average) cv2.putText (display_screen), cpu_lämpötila, (250,250), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0,0,255), 1) cv2.putText (display_screen, kuormituksen keskiarvo, (300,250), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0,255,0), 2)
Pi CCTV -liikkeentunnistimen käynnistäminen
Olen testannut tätä päivien ajan kerätäksesi ja se toimii joka kerta, ja se oli todella hauska rakenne, kunnes vahingoitin yhtä kameraa,