- Pagse-set up ng Raspberry Pi kasama ang Buster at OpenCV
- Pagdaragdag ng Buzzer sa Raspberry Pi 5Inch Display
- Programming Raspberry Pi para sa Pagtuklas sa CCTV Motion
- Pagtuklas ng Paggalaw sa OpenCV gamit ang Raspberry Pi
- Pagtatakda ng Alarma para sa Pagtuklas ng Paggalaw
- Pagsubaybay sa Temperatura at Paggamit ng CPU
- Inilulunsad ang iyong Pi CCTV Motion Detector
Ang OpenCV ay isang napakalakas na tool at na sinamahan ng Raspberry Pi ay maaaring magbukas ng mga pintuan sa maraming mga portable smart device. Sa aming nakaraang artikulo sa pagsubaybay sa Raspberry Pi CCTV, natutunan namin kung paano makakuha ng live na video ng CCTV mula sa isang DVR gamit ang RTSP at ipakita sa isang Raspberry Pi, suriin ito bago magpatuloy. Sa artikulong ito, matututunan natin kung paano makamit ang lakas ng OpenCV at bumuo ng isang sistema ng Pagtuklas ng Raspberry Pi Motion sa aming mga live na kuha sa CCTV. Kung wala kang naka-install na CCTV, maaari ka pa ring bumuo ng isang Raspberry Pi Surveillance system sa pamamagitan ng pagkonekta nang direkta sa mga USB camera sa iyong Pi. At kung ikaw ay hindi isang malaking tagahanga ng Pi at Python, maaari kang bumuo ng isang bagay na katulad sa ESP32, sumangguni sa ESP32 Wi-Fi Door Bell para sa karagdagang detalye.
Susulat kami ng isang script ng sawa na maaaring subaybayan ang lahat ng apat na mga CCTV camera nang sabay-sabay para sa anumang mga aktibidad (paggalaw). Kung ang isang aktibidad ay napansin sa anumang camera, ang aming Raspberry Pi ay awtomatikong magbabago sa partikular na screen ng camera at i-highlight kung aling aktibidad ang naganap, lahat ng ito sa real-time na may lamang 1.5 segundo lag. Nagdagdag din ako ng isang tampok na alarma, tulad ng isang buzzer kung saan maaaring alerto ang gumagamit sa pamamagitan ng pag-beep kung ang isang aktibidad ay napansin. Ngunit maaari mong madaling sukatin ito upang magpadala ng isang mensahe o E-mail o kung ano ang hindi! Nakakatuwa diba !! Magsimula na tayo
Pagse-set up ng Raspberry Pi kasama ang Buster at OpenCV
Gumagamit ako ng Raspberry Pi 3 B + na may Buster OS na tumatakbo dito at ang bersyon ng OpenCV ay 4.1. Kung ganap kang bago, sundin ang mga tutorial sa ibaba bago ka makapagsimula.
Ang layunin ay upang ang iyong Pi up at handa na para sa pag-unlad. Mas okay na magkaroon ng anumang bersyon ng Raspbian OS sa iyong Pi ngunit tiyaking ang bersyon ng OpenCV ay 4.1 o mas mataas. Maaari mong sundin ang alinman sa tutorial sa itaas upang maipon ang iyong OpenCV na tatagal ng oras ngunit mas maaasahan para sa mabibigat na proyekto o direktang mai-install ito mula sa pip gamit ang mga sumusunod na utos.
$ pip install opencv-contrib-python == 4.1.0.25
Kung nag-i-install ka ng OpenCV sa pip sa kauna-unahang pagkakataon, kailangan mo ring i-install ang iba pang mga dependency. Gamitin ang mga utos sa ibaba para doon.
$ 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
Nakagawa na kami ng maraming mga proyekto ng Raspberry Pi OpenCV, maaari mo ring suriin iyon para sa higit pang mga inspirasyon.
Pagdaragdag ng Buzzer sa Raspberry Pi 5Inch Display
Sa panig ng hardware, wala kaming ibang iba kaysa sa isang 5-Inch Display at isang Buzzer. Pagkatapos ng Pag-interface ng 5-Inch Display sa Raspberry Pi, maaari naming direktang mai-mount ang buzzer sa likuran ng Display na nagpalawak ng ilang mga GPIO na pin para sa amin. Nakakonekta ko ang aking Buzzer tulad ng ipinakita sa ibaba-
Kung interesado ka sa paggamit ng higit pang mga I / O pin, kung gayon ang paglalarawan sa ibaba pin ay magiging kapaki-pakinabang. Tulad ng nakikita mo sa mga pinalawig na pin, ang karamihan sa mga pin ay ginagamit ng Display mismo para sa isang touchscreen interface. Ngunit pa rin, mayroon kaming mga pin na 3,5,7,8,10,11,12,13,15,16, at 24 na walang koneksyon at magagamit namin ito para sa aming sariling aplikasyon. Sa tutorial na ito, nakakonekta ako sa isang buzzer sa GPIO 3.
Programming Raspberry Pi para sa Pagtuklas sa CCTV Motion
Ang kumpletong script ng python para sa proyektong ito ay matatagpuan sa ilalim ng pahinang ito, ngunit talakayin natin ang bawat segment ng code upang maunawaan kung paano ito gumagana.
Pagsubaybay sa Maramihang Mga Camera nang walang Lag sa Raspberry Pi gamit ang RTSP
Ang mapaghamong bahagi sa paggawa ng gawaing ito ay upang bawasan ang pagkarga sa Raspberry pi upang maiwasan ang pagkahuli sa streaming. Sa una, sinubukan kong lumipat sa pagitan ng lahat ng apat na camera upang maghanap ng paggalaw ngunit napakatagal (mga 10 segundo). Kaya pinagsama ko ang lahat ng apat na kamera sa isang solong imahe at ginawa ang lahat ng mga paggalaw na nakakakita ng mga aktibidad sa imaheng iyon. Sumulat ako ng dalawang pag-andar, lalo, lumikha ng isang camera at basahin ang camera.
Ang lumikha ng camera function ay ginagamit upang buksan ang cam sa kanyang kaukulang number channel. Tandaan na ang RTSP URL ay nagtatapos sa "02", na nangangahulugang gumagamit ako ng sub-stream na feed ng video na magiging mababa sa resolusyon at kung gayon mas mabilis na basahin. Gayundin, ang uri ng video codec na iyong ginagamit ay nag-aambag din sa bilis, nag-eksperimento ako sa iba't ibang mga code at nalaman kong ang FFMPEG ang pinakamabilis sa lahat.
def create_camera (channel): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / channels /" + channel + "02" #baguhin ang IP upang maiakma sa iyo cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # ID number para sa lapad ay 3 cap.set (4, cam_height) # Ang numero ng ID para sa taas ay 480 cap.set (10, 100) Ang numero ng # ID para sa ningning ay 10 return cap
Sa pagbasa ng pag- andar ng camera , babasahin namin ang lahat ng apat na cams katulad ng cam1, cam2, cam3, at cam4 upang pagsamahin silang lahat sa isang solong imahe na tinatawag na Main_screen . Kapag handa na ang pangunahing screen na ito, gagawin namin ang lahat ng aming OpenCV na trabaho sa imaheng ito.
def read_camera (): tagumpay, kasalukuyang_screen = cam1.read () Main_screen = kasalukuyang_screen tagumpay, kasalukuyang_screen = cam2.read () Main_screen = kasalukuyang_screen tagumpay, kasalukuyang_screen = cam3.read () Main_screen = kasalukuyang_screen tagumpay, current_screen = cam4.read () Main_screen = kasalukuyang_screen na pagbalik (Main_screen)
Ang pangunahing imahe ng screen kasama ang lahat ng apat na cam na pinagsama ay magiging hitsura ng imaheng ipinakita sa ibaba.
Pagtuklas ng Paggalaw sa OpenCV gamit ang Raspberry Pi
Ngayon na handa na namin ang imahe, maaari kaming magsimula sa aming pagtuklas ng paggalaw. Sa loob ng habang loop , nagsisimula kami sa pamamagitan ng pagbabasa ng dalawang magkakaibang mga frame na katulad, frame1 at frame2, pagkatapos ay i-convert ang mga ito sa grayscale
frame1 = read_camera () #Read the first frame greyImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # I-convert sa grey frame2 = read_camera () #Read the 2nd frame greyImage_F2 = cv2.cvtColor (frame2, cv2.ROLOR_)
Pagkatapos ay gumawa kami ng pagkakaiba sa pagitan ng parehong mga imaheng ito upang makita kung ano ang nagbago at sa isang threshold, pinagsasama namin ang lahat ng mga lugar na may pagbabago, uri ng tulad ng isang patak. Karaniwan din na lumabo at lumawak ang imahe upang maiwasan ang matalim na mga gilid.
diffImage = cv2.absdiff (greyImage_F1, greyImage_F2) #gumawa ng pagkakaiba - ito ay cool na blurImage = cv2.GaussianBlur (diffImage, (5,5), 0) _, thresholdImage = cv2.threshold (blurImage, 20,255ES, cv2.) dilatedImage = cv2.dilate (thresholdImage, kernal, iterations = 5)
Susunod na hakbang ay upang makahanap ng mga counter at suriin ang lugar ng bawat counter, sa pamamagitan ng paghahanap ng lugar, maaari nating malaman kung gaano kalaki ang paggalaw. Kung ang lugar ay mas malaki kaysa sa isang tinukoy na halaga sa variable na motion_detected , pagkatapos ay isinasaalang-alang namin iyon bilang isang aktibidad at iguhit ang isang kahon sa paligid ng pagbabago upang i-highlight ito sa gumagamit.
contours, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) Ang #find contour ay isang magic function para sa contour sa mga contour: #sa bawat pagbabago na nakita (x, y, w, h) = cv2.boundingRect (contour) #get ang lokasyon kung saan nahanap ang pagbabago kung cv2.contourArea (contour)> motion_threshold: cv2.rectangle (frame1, (x, y), (x + w, y + h), (255, 255, 0), 1) display_screen = find_screen ()
Ang function na find_screen () ay ginagamit upang malaman kung saan naganap ang aktibidad sa gitna ng apat na mga camera. Mahahanap natin iyon dahil alam namin ang mga halagang x at y ng paggalaw. Inihambing namin ang mga halagang x at y sa lokasyon ng bawat screen upang malaman kung aling screen ang nagbigay ng aktibidad at muli naming i-crop ang partikular na screen, upang maipakita namin ito sa pi touch screen.
def find_screen (): if (x <cam_width): if (y <cam_height): screen = frame1 print ("Aktibidad sa cam screen 1") iba pa: screen = frame1 print ("Aktibidad sa cam screen 2") iba pa: kung (y <cam_height): screen = frame1 print ("Aktibidad sa cam screen 3") iba pa: screen = frame1 print ("Aktibidad sa cam screen 4") pagbabalik (screen)
Pagtatakda ng Alarma para sa Pagtuklas ng Paggalaw
Kapag nalaman natin, kung aling screen, ang paggalaw ay napansin, madali itong magdagdag ng anumang uri ng alarma na kailangan namin. Dito bibigyan namin ng beep ang isang buzzer na konektado sa GPIO 3. Ang kung pahayag ay suriin kung ang paggalaw ay napansin sa screen 3 at nagdaragdag ng isang variable na tinatawag na trig_alarm . Maaari mong makita ang anumang screen na iyong pinili o kahit na sa maraming mga screen.
kung ((x> cam_width) at (y
Kung ang halaga ng trig_alarm ay umabot ng higit sa 3, sabay-sabay kaming mag-beep ng isang buzzer. Ang dahilan para sa bilang na ito ay kung minsan napansin ko ang mga anino o mga ibon na lumikha ng pekeng alarma. Kaya sa ganitong paraan lamang kung mayroong isang tuluy-tuloy na aktibidad para sa 3 mga frame, makakakuha kami ng isang alarma.
if (trig_alarm> = 3): # wait for conts 3 galaw #Beep the Buzzer GPIO.output (BUZZER, 1) time.s Sleep (0.02) GPIO.output (BUZZER, 0) trig_alarm = 0
Pagsubaybay sa Temperatura at Paggamit ng CPU
Ang system ay naka-indent upang gumana 24x7 at samakatuwid ang Pi ay maaaring maging napakainit, kaya't nagpasya akong subaybayan ang temperatura at paggamit ng CPU sa pamamagitan ng pagpapakita ng mga halagang iyon sa screen. Nakuha namin ang impormasyong ito gamit ang gpiozero library.
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
Inilulunsad ang iyong Pi CCTV Motion Detector
Sinubukan ko ito nang maraming araw upang makatipon at gumagana ito sa bawat solong oras at ito ay talagang isang kasiya-siyang build hanggang sa nasira ko ang isang camera,