- A Raspberry Pi beállítása a Buster és az OpenCV használatával
- Zümmögő hozzáadása a Raspberry Pi 5Inch kijelzőhöz
- Raspberry Pi programozása CCTV mozgásérzékeléshez
- Mozgásérzékelés OpenCV-n Raspberry Pi segítségével
- Riasztás beállítása a mozgásérzékeléshez
- A CPU hőmérsékletének és használatának figyelése
- A Pi CCTV mozgásérzékelő elindítása
Az OpenCV egy hatékony eszköz, amely a Raspberry Pi-vel kombinálva számos hordozható intelligens eszköz számára nyithat ajtót. Az előző Raspberry Pi CCTV megfigyelő cikkünkben megtanultuk, hogyan lehet élő CCTV videókat szerezni egy DVR-ről RTSP használatával és megjeleníteni egy Raspberry Pi-n, ezt folytassa, mielőtt folytatja. Ebben a cikkben megtudhatjuk, hogyan lehet kihasználni az OpenCV erejét és kiépíteni a Raspberry Pi mozgásérzékelő rendszert élő CCTV felvételeinkre. Ha még nincs telepítve CCTV, akkor is elkészíthet egy Raspberry Pi felügyeleti rendszert, ha USB kamerákat csatlakoztat közvetlenül a Pi-hez. Ha pedig nem vagy nagy rajongó a Pi és a Python iránt, akkor építhetsz valami hasonlót az ESP32-tel, további részletekért lásd az ESP32 Wi-Fi kapucsengőt.
Írunk egy python szkriptet, amely egyszerre képes figyelni mind a négy CCTV kamerát bármilyen tevékenységre (mozgásra). Ha bármelyik kamerán tevékenységet észlelnek, a Raspberry Pi automatikusan átvált az adott kamera képernyőjére, és kiemeli, hogy melyik tevékenység történt, mindezt valós időben, mindössze 1,5 másodperces késéssel. Hozzáadtam egy riasztási funkciót is, például egy hangjelzőt, amelyhez csipogással lehet figyelmeztetni a felhasználót, ha tevékenységet észlelnek. De ezt könnyedén méretezheti, hogy üzenetet vagy e-mailt küldjön, vagy mi nem! Izgalmas jobb !! Kezdjük el
A Raspberry Pi beállítása a Buster és az OpenCV használatával
A Raspberry Pi 3 B + szoftvert használom rajta futó Buster OS-sel és az OpenCV verziója 4.1. Ha teljesen új vagy, akkor az indulás előtt kövesse az alábbi útmutatásokat.
A cél az, hogy a Pi fel legyen készen áll a fejlesztésre. Rendben van, ha a Raspbian OS bármely verziója van a Pi-n, de győződjön meg arról, hogy az OpenCV verziója 4.1 vagy újabb. Kövesse a fenti oktatóanyagot az OpenCV összeállításához, amely órákig tart, de megbízhatóbb nehéz projektekhez, vagy egyszerűen telepítse közvetlenül a pip-ről a következő parancsokkal.
$ pip install opencv-contrib-python == 4.1.0.25
Ha először telepíti az OpenCV-t pip-tal, akkor telepítenie kell a többi függőséget is. Ehhez használja az alábbi parancsokat.
$ 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
Számos Raspberry Pi OpenCV projektet építettünk már, ezt is megnézheti további inspirációkért.
Zümmögő hozzáadása a Raspberry Pi 5Inch kijelzőhöz
Hardveres oldalon nincs sok más, csak egy 5 hüvelykes kijelző és egy hangjelző. Miután összekapcsolta az 5 hüvelykes kijelzőt a Raspberry Pi-vel, közvetlenül felszerelhetjük a hangjelzőt a kijelző hátuljára, amely kiterjesztett számunkra néhány GPIO-tűt. Az alább látható módon csatlakoztattam a hangjelzőmet -
Ha további I / O csapok használatára kíváncsi, akkor az alábbi csapleírás hasznos lesz. Amint a kibővített csapok közül látható, a legtöbb csapot maga a kijelző használja érintőképernyős interfészként. De mégis vannak 3,5,7,8,10,11,12,13,15,16 és 24 csapok, amelyek nincsenek kapcsolatban, és felhasználhatjuk saját alkalmazásunkhoz. Ebben az oktatóanyagban egy hangjelzőt csatlakoztattam a GPIO 3-hoz.
Raspberry Pi programozása CCTV mozgásérzékeléshez
A projekt teljes python szkriptje az oldal alján található, de beszéljük meg a kód egyes szegmenseit, hogy megértsük működésüket.
Több kamera késleltetés nélküli figyelése a Raspberry Pi-n RTSP használatával
Ennek a munkának a kihívása az volt, hogy csökkentse a Raspberry pi terhelését, hogy elkerülje a streaming késését. Kezdetben megpróbáltam váltani mind a négy kamera között, hogy mozgást keressek, de nagyon elmaradt (kb. 10 másodperc). Tehát mind a négy kamerát egyetlen képpé egyesítettem, és az összes mozgásérzékelési tevékenységet elvégeztem ezen a képen. Két funkciót írtam, nevezetesen: fényképezőgép létrehozása és kamera olvasása.
A Kamera létrehozása funkcióval a kamera megnyitható a megfelelő csatornaszámmal. Ne feledje, hogy az RTSP URL-je „02” -nel végződik, ami azt jelenti, hogy az alfolyamban lévő videó hírcsatornát használom, amelynek felbontása alacsony, és így gyorsabban olvasható. Ezenkívül az általad használt videokodek típusa is hozzájárul a sebességhez. Kísérleteztem különböző kódokkal, és megállapítottam, hogy az FFMPEG mindenki számára gyors.
def create_kamera (csatorna): rtsp = "rtsp: //" + rtsp_felhasználónév + ":" + rtsp_jelszó + "@" + rtsp_IP + ": 554 / Streaming / csatornák /" + csatorna + "02" #változtassa meg az IP-t, hogy megfeleljen tiéd cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # A szélesség azonosító száma 3 cap.set (4, cam_height) # A magasság azonosító száma 480 cap.set (10, 100) # A fényerő azonosító száma 10 visszatérő sapka
Az olvasási kamera funkció, akkor olvassa el az összes négy bütyök nevezetesen cam1, cam2, cam3 és cam4 össze őket egyetlen képpé úgynevezett Main_screen . Miután ez a főképernyő elkészült, minden OpenCV munkánkat elvégezzük ezen a képen.
def read_camera (): siker, current_screen = cam1.read () Main_screen = jelenlegi_screen siker, current_screen = cam2.read () Main_screen = current_screen siker, current_screen = cam3.read () Main_screen = current_screen siker, current_screen = cam4.read () Main_screen = aktuális_screen visszatér (Main_screen)
A főképernyő mind a négy bütykével együtt úgy néz ki, mint az alább látható.
Mozgásérzékelés OpenCV-n Raspberry Pi segítségével
Most, hogy készen áll a kép, elkezdhetjük a mozgásérzékelésünket. A while ciklus belsejében két különböző képkockát olvasunk el, nevezetesen: frame1 és frame2, majd átalakítjuk őket szürkeárnyalatosra
frame1 = read_camera () # Olvassa el az első keretet grayImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Konvertálás szürke frame2-be = read_camera () # Olvassa el a 2. keretet greymage_F2 = cv2.cvtColor (frame2, cv2COLAY_)
Ezután különbséget teszünk mindkét kép között, hogy lássuk, mi változott, és egy küszöbértékkel csoportosítjuk az összes helyet, ahol változás történt, olyan, mint egy folt. A kép elmosódása és tágítása is gyakori az éles élek elkerülése érdekében.
diffImage = cv2.absdiff (greyImage_F1, greyImage_F2) # megkapja a differenciát - ez hűvös blurImage = cv2.GaussianBlur (diffImage, (5,5), 0) _, küszöbKép = cv2.küszöb (blurImage, 20,255ES, cv2.THR) dilatedImage = cv2.dilate (küszöbKép, kernal, iterációk = 5)
A következő lépés az, hogy megtalálja a számlálókat és ellenőrizze az egyes számlálók területét. A terület megtalálásával kitalálhatjuk, mekkora a mozgás. Ha a terület nagyobb, mint a motion_detected változó megadott értéke, akkor ezt tevékenységnek tekintjük, és egy négyzetet rajzolunk a változás köré, hogy kiemeljük a felhasználó számára.
kontúrok, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) Az #find contour varázslatos függvény a kontúrokon a kontúrokban: # minden észlelt változáshoz (x, y, w, h) = cv2.boundingRect (contour) # megkapja azt a helyet, ahol a változás megtalálható, ha cv2.contourArea (contour)> motion_küszöb: cv2.stéglalap (frame1, (x, y), (x + w, y + h), (255, 255, 0), 1) display_screen = find_screen ()
A find_screen () függvény segítségével megtudhatjuk, hol folyt a tevékenység a négy kamera között. Megállapíthatjuk, hogy mivel tudjuk a mozgás x és y értékét. Összehasonlítjuk ezeket az x és y értékeket az egyes képernyők helyével, hogy megtudjuk, melyik képernyő adott tevékenységet, és ismét kivágjuk az adott képernyőt, hogy megjelenítsük a pi érintőképernyőn.
def find_screen (): if (x <cam_width): if (y <cam_height): screen = frame1 print ("Tevékenység az 1. cam képernyőn") else: screen = frame1 print ("Tevékenység a 2. cam képernyőn") else: if (y <cam_height): screen = frame1 print ("Tevékenység a 3. cam képernyőn") else: screen = frame1 print ("Activity in cam 4 screen") return (screen)
Riasztás beállítása a mozgásérzékeléshez
Miután megtudtuk, melyik képernyőn érzékeli a mozgást, könnyen hozzá lehet adni bármilyen típusú riasztást. Itt egy GPIO 3-hoz csatlakoztatott hangjelzést fogunk csipogni. Az if utasítás ellenőrzi, hogy a 3. képernyőn észlelték-e a mozgást, és növeli-e a trig_alarm nevű változót . Bármelyik képernyőt észlelheti, vagy akár több képernyőn is.
if ((x> cam_width) és (y
Ha a trig_alarm értéke eléri a 3-at, akkor egyszer hangjelzést adunk. Ennek a számlálásnak az az oka, hogy néha észrevettem, hogy árnyékok vagy madarak hamis riasztást keltenek. Tehát csak akkor kapunk riasztást, ha 3 képkocka folyamatos tevékenységet folytat.
if (trig_alarm> = 3): # várjon 3 mozdulatot
A CPU hőmérsékletének és használatának figyelése
A rendszer 24x7-szer működik, így a Pi nagyon felmelegedhet, ezért úgy döntök, hogy figyelemmel kísérem a hőmérsékletet és a CPU-használatot azáltal, hogy ezeket az értékeket megjelenítem a képernyőn. Ezt az információt a gpiozero könyvtár segítségével szereztük be.
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)
A Pi CCTV mozgásérzékelő elindítása
Napok óta teszteltem, hogy összegyűjtsem, és minden egyes alkalommal működik, és nagyon szórakoztató konstrukció volt, amíg megrongáltam egy kamerát,