- Raspberry Pi iestatīšana ar Buster un OpenCV
- Buzzer pievienošana Raspberry Pi 5Inch displejam
- Aveņu Pi programmēšana videonovērošanas kustību noteikšanai
- Kustības noteikšana OpenCV, izmantojot Raspberry Pi
- Trauksmes iestatīšana kustības noteikšanai
- CPU temperatūras un lietošanas uzraudzība
- Pi CCTV kustības detektora palaišana
OpenCV ir spēcīgs rīks, un tas apvienojumā ar Raspberry Pi var atvērt durvis daudzām pārnēsājamām viedierīcēm. Mūsu iepriekšējā Raspberry Pi CCTV uzraudzības rakstā mēs uzzinājām, kā iegūt tiešraides videonovērošanas video no DVR, izmantojot RTSP, un parādīt Raspberry Pi, pirms turpināt, pārbaudiet to. Šajā rakstā mēs uzzināsim, kā izmantot OpenCV jaudu un izveidot Raspberry Pi kustības noteikšanas sistēmu uz mūsu tiešraides videonovērošanas materiāliem. Ja jums nav instalēta videonovērošanas kamera, jūs joprojām varat izveidot Raspberry Pi novērošanas sistēmu, savienojot USB kameras tieši ar savu Pi. Un, ja jūs neesat liels Pi un Python ventilators, varat izveidot kaut ko līdzīgu ar ESP32, sīkāku informāciju skatiet ESP32 Wi-Fi durvju zvanā.
Mēs uzrakstīsim pitona skriptu, kas var vienlaikus uzraudzīt visas četras videonovērošanas kameras jebkurām darbībām (kustībai). Ja kādā kamerā tiek konstatēta darbība, mūsu Raspberry Pi automātiski pārslēgsies uz konkrēto kameras ekrānu un uzsvērs, kura darbība notika, tas viss reāllaikā ar tikai 1,5 sekunžu nobīdi. Esmu pievienojis arī trauksmes funkciju, piemēram, skaņas signālu, kas var brīdināt lietotāju, pīkstot, ja tiek konstatēta darbība. Bet jūs varat to viegli pielāgot, lai nosūtītu ziņojumu vai e-pastu, vai ne! Aizraujošas tiesības !! Sāksim
Raspberry Pi iestatīšana ar Buster un OpenCV
Es izmantoju Raspberry Pi 3 B +, kurā darbojas Buster OS, un OpenCV versija ir 4.1. Ja esat pilnīgi jauns, pirms sākat, izpildiet tālāk sniegtos norādījumus.
Mērķis ir panākt, lai jūsu Pi būtu gatavs attīstībai. Ir labi, ja Pi ir jebkura Raspbian OS versija, taču pārliecinieties, vai OpenCV versija ir 4.1 vai jaunāka. Varat vai nu sekot iepriekš minētajai apmācībai, lai apkopotu savu OpenCV, kas prasīs stundas, bet ir ticamāks smagiem projektiem, vai vienkārši instalējiet to tieši no pip, izmantojot šādas komandas.
$ pip install opencv-contrib-python == 4.1.0.25
Ja OpenCV ar pip instalējat pirmo reizi, jums jāinstalē arī citas atkarības. Tam izmantojiet zemāk norādītās 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
Mēs jau esam izveidojuši daudzus Raspberry Pi OpenCV projektus. To varat arī pārbaudīt, lai iegūtu vairāk iedvesmas.
Buzzer pievienošana Raspberry Pi 5Inch displejam
Aparatūras pusē mums nav daudz cita kā 5 collu displejs un skaņas signāls. Pēc 5 collu displeja saskarnes ar Raspberry Pi mēs varam tieši uzstādīt skaņas signālu displeja aizmugurē, kas mums ir paplašinājis dažus GPIO tapas. Esmu pievienojis savu skaņas signālu, kā parādīts zemāk-
Ja jūs interesē vairāk I / O tapu izmantošana, noderēs zemāk redzamais tapu apraksts. Kā redzat starp paplašinātajām tapām, lielāko daļu tapu skārienekrāna saskarnē izmanto pats displejs. Bet tomēr mums ir 3,5, 7, 8, 10, 11, 12, 13, 15, 16 un 24 tapas, kurām nav savienojuma, un mēs to varam izmantot savām lietojumprogrammām. Šajā apmācībā esmu pievienojis skaņas signālu GPIO 3.
Aveņu Pi programmēšana videonovērošanas kustību noteikšanai
Pilns šī projekta python skripts ir atrodams šīs lapas apakšdaļā, taču apspriedīsim katru koda segmentu, lai saprastu, kā tas darbojas.
Vairāku kameru novērošana bez novirzes uz Raspberry Pi, izmantojot RTSP
Šī darba izaicinošā daļa bija samazināt Raspberry pi slodzi, lai izvairītos no straumēšanas aizkavēšanās. Sākumā es mēģināju pārslēgties starp visām četrām kamerām, lai meklētu kustību, taču tas bija ļoti atpalicis (apmēram 10 sekundes). Tāpēc es apvienoju visas četras kameras vienā attēlā un veicu visas kustības noteikšanas darbības šajā attēlā. Es uzrakstīju divas funkcijas, proti, izveidot kameru un lasīt kameru.
Izveidot kameru funkcija tiek izmantota, lai atvērtu cam ar savu attiecīgo kanāla numuru. Ņemiet vērā, ka RTSP URL beidzas ar “02”, kas nozīmē, ka es izmantoju apakšplūsmas video plūsmu, kuras izšķirtspēja ir zema un līdz ar to ātrāk lasāma. Arī jūsu izmantotā video kodeka veids veicina ātrumu, es eksperimentēju ar dažādiem kodiem un atklāju, ka FFMPEG ir visu gavēnis.
def create_camera (kanāls): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / channels /" + channel + "02" #mainiet IP, lai tas atbilstu yours cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # ID platumam ir 3 cap.set (4, cam_height) # ID ID augstumam ir 480 cap.set (10, 100) # ID spilgtumam ir 10 atgriešanās vāciņš
Jo lasīt kameras funkciju, mēs lasīt visas četras izciļņi proti cam1, cam2, cam3 un cam4 apvienot tos visus vienā attēlā sauc Main_screen . Kad šis galvenais ekrāns būs gatavs, mēs veiksim visu mūsu OpenCV darbu pie šī attēla.
def read_camera (): panākumi, current_screen = cam1.read () Main_screen = pašreizējie_screen panākumi, current_screen = cam2.read () Main_screen = pašreizējie_screen panākumi, current_screen = cam3.read () Main_screen = current_screen panākumi, current_screen = cam4.read () Main_screen = pašreizējais_screen return (Main_screen)
Galvenais ekrāna attēls ar visām četrām izciļņiem apvienosies kā zemāk redzamais attēls.
Kustības noteikšana OpenCV, izmantojot Raspberry Pi
Tagad, kad attēls ir gatavs, mēs varam sākt ar kustību noteikšanu. Inside kamēr cilpa , mēs sākam nolasot divas dažādas rāmji proti, frame1 un frame2, tad pārvērst tos uz pelēktoņu
frame1 = read_camera () # Izlasiet pirmo kadru greyImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Konvertēšana uz pelēku frame2 = read_camera () # Izlasiet 2. kadru grayImage_F2 = cv2.cvtColor (frame2, cv2COLOR_)
Tad mēs ņemam atšķirību starp abiem šiem attēliem, lai redzētu, kas ir mainījies, un ar slieksni mēs sagrupējam visas vietas, kurās bija izmaiņas, līdzīgi kā lāse. Ir arī izplūdis un paplašināts attēls, lai izvairītos no asām malām.
diffImage = cv2.absdiff (greyImage_F1, grayImage_F2) # iegūt atšķirību - tas ir foršs izplūdumsImage = cv2.GaussianBlur (diffImage, (5,5), 0) _, thresholdImage = cv2.threshold (blurImage, 20,255ES, cv2.T) dilatedImage = cv2.dilate (slieksnisImage, kernal, iterācijas = 5)
Nākamais solis ir atrast skaitītājus un pārbaudīt katra skaitītāja laukumu, atrodot laukumu, mēs varam noskaidrot, cik liela ir kustība. Ja laukums ir lielāks par norādīto vērtību mainīgajā motion_detected , tad mēs to uzskatām par darbību un zīmējam rūtiņu ap izmaiņām, lai to izceltu lietotājam.
contours, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find contour ir burvju funkcija kontūram kontūrās: # katrai noteiktajai izmaiņai (x, y, w, h) = cv2.boundingRect (contour) # iegūt vietu, kur tika atrastas izmaiņas, ja cv2.contourArea (contour)> motion_threshold: cv2. taisnstūris (frame1, (x, y), (x + w, y + h), (255, 255, 0), 1) display_screen = atrast_screen ()
Funkcija find_screen () tiek izmantota, lai atrastu darbību starp četrām kamerām. Mēs varam konstatēt, ka, tā kā mēs zinām kustības x un y vērtības. Mēs salīdzinām šīs x un y vērtības ar katra ekrāna atrašanās vietu, lai atrastu, kurš ekrāns deva darbību, un mēs atkal apgriežam konkrēto ekrānu, lai mēs to varētu parādīt pi skārienekrānā.
def find_screen (): ja (x <kameras platums): ja (y <kameras augstums): ekrāns = rāmis1 druka ("Darbība 1. kameras ekrānā") cits: ekrāns = rāmis1 druka ("Darbība 2. kameras ekrānā") cits: ja (y <cam_height): ekrāns = rāmis1 druka ("Darbība 3. kameras ekrānā") cits: ekrāns = rāmis1 druka ("Darbība 4. kameras ekrānā") atgriešanās (ekrāns)
Trauksmes iestatīšana kustības noteikšanai
Kad mēs zinām, kurā ekrānā tiek konstatēta kustība, ir viegli pievienot jebkura veida trauksmi, kas mums nepieciešama. Šeit mēs iepīkstīsimies ar skaņas signālu, kas savienots ar GPIO 3. Ja paziņojums if pārbauda, vai 3. ekrānā tika konstatēta kustība, un tas palielina mainīgo ar nosaukumu trig_alarm . Jūs varat noteikt jebkuru ekrānu pēc savas izvēles vai pat vairākos ekrānos.
ja ((x> cam_width) un (y
Ja trig_alarm vērtība sasniedz vairāk nekā 3, mēs vienreiz pīkstēsim skaņas signālu. Šīs skaitīšanas iemesls ir tas, ka dažreiz es pamanīju ēnas vai putnus, kas radīja viltus trauksmi. Tātad šādā veidā tikai tad, ja 3 kadriem ir nepārtraukta darbība, mēs saņemsim trauksmi.
ja (trig_alarm> = 3): # gaidiet kontus 3 kustības
CPU temperatūras un lietošanas uzraudzība
Sistēmai ir paredzēts darboties 24x7, un līdz ar to Pi var kļūt ļoti karsts, tāpēc es nolēmu uzraudzīt temperatūru un centrālā procesora lietojumu, parādot šīs vērtības ekrānā. Mēs esam ieguvuši šo informāciju, izmantojot bibliotēku gpiozero.
cpu = CPUTemperature () slodze = LoadAverage () cpu_temperature = str ((cpu.temperature) // 1) slodzes_vidējais = 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 kustības detektora palaišana
Es to esmu pārbaudījis vairākas dienas, lai apkopotu, un tas darbojas katru reizi, un tas bija patiešām jautri, līdz sabojāju vienu kameru,