- बस्टर और OpenCV के साथ रास्पबेरी पाई की स्थापना
- रास्पबेरी पाई 5 इंच डिस्प्ले में बजर जोड़ना
- सीसीटीवी मोशन डिटेक्शन के लिए रास्पबेरी पाई का प्रोग्रामिंग
- रास्पबेरी पाई का उपयोग करके ओपनसीवी पर मोशन डिटेक्शन
- मोशन डिटेक्शन के लिए अलार्म सेट करना
- सीपीयू तापमान और उपयोग की निगरानी
- अपने पाई सीसीटीवी मोशन डिटेक्टर को लॉन्च करना
OpenCV एक शक्तिशाली उपकरण है और रास्पबेरी पाई के साथ मिलकर कई पोर्टेबल स्मार्ट उपकरणों के लिए दरवाजे खोल सकते हैं। हमारे पिछले रास्पबेरी पाई सीसीटीवी निगरानी लेख में, हमने सीखा कि आरटीएसपी का उपयोग करते हुए एक डीवीआर से लाइव सीसीटीवी वीडियो कैसे प्राप्त करें और रास्पबेरी पाई पर प्रदर्शित करें, आगे बढ़ने से पहले जांच करें। इस अनुच्छेद में, हम सीखेंगे कि ओपनसीवी की शक्ति का लाभ कैसे उठाया जाए और हमारे लाइव सीसीटीवी फुटेज पर रास्पबेरी पाई मोशन डिटेक्शन सिस्टम का निर्माण किया जाए । यदि आपके पास एक सीसीटीवी स्थापित नहीं है, तो आप अभी भी USB कैमरों को सीधे अपने Pi से जोड़कर रास्पबेरी Pi निगरानी प्रणाली का निर्माण कर सकते हैं। और यदि आप पाई और पायथन के बहुत बड़े प्रशंसक नहीं हैं, तो आप ESP32 के साथ कुछ समान बना सकते हैं, अधिक जानकारी के लिए ESP32 वाई-फाई डोर बेल का संदर्भ लें।
हम एक पाइथन स्क्रिप्ट लिखेंगे जो किसी भी गतिविधियों (गति) के लिए एक साथ सभी चार सीसीटीवी कैमरों की निगरानी कर सकती है। अगर किसी भी कैमरे पर किसी गतिविधि का पता चलता है, तो हमारा रास्पबेरी पाई स्वचालित रूप से उस विशेष कैमरा स्क्रीन में बदल जाएगा और जो गतिविधि हुई, वह सब वास्तविक समय में सिर्फ 1.5 सेकंड के अंतराल के साथ होगी। मैंने बजर की तरह एक अलार्म फीचर भी जोड़ा है, जिससे किसी गतिविधि का पता चलने पर उपयोगकर्ता को बीप करके अलर्ट किया जा सकता है। लेकिन आप आसानी से संदेश या ई-मेल भेजने के लिए इसे माप सकते हैं या क्या नहीं! रोमांचक सही !! आएँ शुरू करें
बस्टर और OpenCV के साथ रास्पबेरी पाई की स्थापना
मैं रास्पबेरी पाई 3 बी + का उपयोग कर रहा हूं, जिस पर बस्टर ओएस चल रहा है और ओपनसीवी का संस्करण 4.1 है। यदि आप पूरी तरह से नए हैं, तो शुरू करने से पहले नीचे दिए गए ट्यूटोरियल का पालन करें।
लक्ष्य के लिए अपने पाई है और विकास के लिए तैयार है। आपके पाई पर रास्पियन ओएस का कोई भी संस्करण होना ठीक है, लेकिन सुनिश्चित करें कि OpenCV का संस्करण 4.1 या अधिक है। आप अपने OpenCV को संकलित करने के लिए उपर्युक्त ट्यूटोरियल का अनुसरण कर सकते हैं, जिसमें घंटों लगेंगे लेकिन भारी परियोजनाओं के लिए अधिक विश्वसनीय है या बस इसे निम्न कमांड का उपयोग करके सीधे पाइप से इंस्टॉल करें।
$ पाइप स्थापित opencv-contrib-python == 4.1.0.25
यदि आप पहली बार पाइप के साथ OpenCV स्थापित कर रहे हैं, तो आपको अन्य निर्भरताएं भी स्थापित करनी होंगी। उसके लिए नीचे दिए गए कमांड का उपयोग करें।
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev $ sudo apt-get Install dev libhdf5-serial-dev libhdf5-103 $ sudo apt-get install
हमने पहले ही कई रास्पबेरी पाई ओपनसीवी परियोजनाओं का निर्माण किया है, आप यह भी देख सकते हैं कि अधिक प्रेरणा के लिए।
रास्पबेरी पाई 5 इंच डिस्प्ले में बजर जोड़ना
हार्डवेयर पक्ष में, हमारे पास 5-इंच डिस्प्ले और बजर के अलावा बहुत कुछ नहीं है। रास्पबेरी पाई के साथ 5-इंच डिस्प्ले को इंटरफैस करने के बाद, हम सीधे बजर को डिस्प्ले के पीछे माउंट कर सकते हैं जिसने हमारे लिए कुछ जीपीओ पिन को बढ़ाया है। मैंने अपना बजर कनेक्ट किया है जैसा कि नीचे दिखाया गया है-
यदि आप अधिक आई / ओ पिन का उपयोग करने में रुचि रखते हैं, तो नीचे दिए गए पिन विवरण उपयोगी होंगे। जैसा कि आप विस्तारित पिंस के बीच देख सकते हैं, अधिकांश पिन एक टचस्क्रीन इंटरफेस के लिए डिस्प्ले द्वारा ही उपयोग किए जाते हैं। लेकिन फिर भी, हमारे पास 3,5,7,8,10,11,12,13,15,16, और 24 पिन हैं जिनका कोई संबंध नहीं है और हम इसे अपने स्वयं के अनुप्रयोग के लिए उपयोग कर सकते हैं। इस ट्यूटोरियल में, मैंने एक बजर को GPIO 3 से जोड़ा है।
सीसीटीवी मोशन डिटेक्शन के लिए रास्पबेरी पाई का प्रोग्रामिंग
इस परियोजना के लिए पूरी अजगर स्क्रिप्ट इस पृष्ठ के निचले भाग में पाई जा सकती है, लेकिन आइए कोड के प्रत्येक खंड पर चर्चा करें कि यह कैसे काम करता है।
आरटीएसपी का उपयोग करके रास्पबेरी पाई पर लाग के बिना कई कैमरों की निगरानी करना
इस काम को करने में चुनौतीपूर्ण हिस्सा रास्पबेरी पाई पर भार को कम करना था ताकि स्ट्रीमिंग में कोई कमी न रह सके। प्रारंभ में, मैंने गति को देखने के लिए सभी चार कैमरों के बीच स्विच करने की कोशिश की लेकिन यह बहुत ही सुस्त था (लगभग 10 सेकंड)। इसलिए मैंने सभी चार कैमरों को एक ही इमेज में जोड़ दिया और उस इमेज पर सभी मोशन डिटेक्टिंग एक्टिविटीज की। मैंने दो कार्य लिखे, एक कैमरा बनाया और एक कैमरा पढ़ा।
कैमरा बनाने के समारोह अपने संबंधित चैनल संख्या के साथ कैमरा खोलने के लिए प्रयोग किया जाता है। ध्यान दें कि RTSP URL "02" के साथ समाप्त होता है, जिसका अर्थ है कि मैं सब-स्ट्रीम वीडियो फीड का उपयोग कर रहा हूं, जो रिज़ॉल्यूशन में कम होगा और इसलिए पढ़ने में तेज़ होगा। इसके अलावा, आपके द्वारा उपयोग किए जाने वाले वीडियो कोडेक का प्रकार भी गति में योगदान देता है, मैंने विभिन्न कोडों के साथ प्रयोग किया और पाया कि FFMPEG सभी का उपवास है।
def create_camera (चैनल): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / स्ट्रीम / चैनल /" + चैनल + "02" #change IP को सूट करने के लिए। तुम्हारा कैप = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, कैम_ एक्सपोज़र) # चौड़ाई के लिए आईडी नंबर 3 कैप है ।सेट (4, कैम_हाइट) # ऊंचाई के लिए आईडी नंबर 480 cap.set (10, 100) है।) चमक के लिए # आईडी नंबर 10 रिटर्न कैप है
में पढ़ने कैमरा समारोह, हम सब चार कैम अर्थात् cam1, CAM2, cam3, और cam4 उन सब नामक केवल एक छवि में गठबंधन करने के लिए पढ़ा जाएगा Main_screen । एक बार यह मुख्य स्क्रीन तैयार हो जाने के बाद, हम इस छवि पर अपने सभी OpenCV काम करेंगे।
def read_camera (): सक्सेस, करेंट_स्क्रीन = कैम 1।्रेड () मेन_स्क्रीन = करेंट_स्क्रीन सक्सेस, करंट_स्क्रीन = कैम 2.डर () मेन_स्क्रीन = करंट_स्क्रीन सक्सेस, करंट_स्क्रीन = कैम 3.डर () मेन_स्क्रीन = करंट_स्क्रीन सक्सेस, करंट_स्क्रीन = कैम 4.डर () मेन_स्क्रीन = चालू_स्क्रीन रिटर्न (मेन_स्क्रीन)
संयुक्त सभी चार कैमों के साथ मुख्य स्क्रीन छवि नीचे दिखाई गई छवि की तरह दिखाई देगी।
रास्पबेरी पाई का उपयोग करके ओपनसीवी पर मोशन डिटेक्शन
अब जबकि हमारे पास छवि तैयार है, हम अपनी गति का पता लगाने के साथ शुरू कर सकते हैं। लूप के अंदर, हम दो अलग-अलग फ्रेमों अर्थात् फ्रेम 1 और फ्रेम 2 को पढ़कर शुरू करते हैं , फिर उन्हें ग्रेस्केल में बदलते हैं
फ़्रेम 1 = read_camera () # पहला फ्रेम ग्रेइमेज_एफ 1 = cv2.cvtColor (फ्रेम 1, cv2.COLOR_BGR2GRAY) # ग्रे फ्रेम 2 में परिवर्तित करें = read_camera () #Read the 2nd फ्रेम grayImage_F2 = cv2.cvtColor (फ्रेम 2)
फिर हम इन दोनों छवियों के बीच एक अंतर लेते हैं कि क्या बदल गया है और एक सीमा के साथ, हम उन सभी स्थानों को समूह बनाते हैं जिनमें परिवर्तन हुआ था, एक बूँद की तरह। तेज किनारों से बचने के लिए छवि को धुंधला करना और पतला करना भी आम है।
diffImage = cv2.absdiff (greymmage_F1, grayImage_F2) #get the diffance --this is cool blurImage = cv2.GaussianBlur (डिफिमेज, (5,5), 0) _, थ्रेशोल्डमैजेज = cv2.threshdold-.shreshold_shreshold_freshold.nindz.zdz)) dilatedImage = cv2.dilate (थ्रेशोल्डमैज, कर्नेल, पुनरावृत्तियों = 5)
अगला कदम काउंटरों की खोज करना है और प्रत्येक काउंटर के क्षेत्र की जांच करना है, क्षेत्र का पता लगाकर हम यह पता लगा सकते हैं कि गति कितनी बड़ी है। यदि क्षेत्र चर गति_निर्धारित में एक निर्दिष्ट मान से बड़ा है, तो हम उस गतिविधि के रूप में विचार करते हैं और इसे उपयोगकर्ता को हाइलाइट करने के लिए परिवर्तन के चारों ओर एक बॉक्स बनाते हैं।
contours, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find समोच्च समोच्च में समोच्च के लिए एक जादुई कार्य है: # हर परिवर्तन का पता लगाया जाता है (x, y, w, h) = cv2.oubingRecting (समोच्च) उस स्थान को भूल जाएं जहां परिवर्तन पाया गया था अगर cv2.contourArea (समोच्च)> गति_थ्रूल्ड: cv2.rectangle (फ्रेम 1, (x, y), (x + w, y + h) (255, 255, 0), 1) डिस्प्ले_स्क्रीन = फाइंडस्क्रीन ()
फ़ंक्शन find_screen () का उपयोग यह जानने के लिए किया जाता है कि गतिविधि चार कैमरों के बीच कहाँ हुई थी। हम पा सकते हैं कि चूंकि हम गति के x और y मानों को जानते हैं। हम प्रत्येक स्क्रीन के स्थान पर इन x और y मानों की तुलना यह जानने के लिए करते हैं कि किस स्क्रीन ने गतिविधि दी और हम फिर से उस विशेष स्क्रीन को क्रॉप करते हैं, ताकि हम इसे pi टच स्क्रीन पर प्रदर्शित कर सकें।
def find_screen (): if (x <कैम_वेशन): if (y <cam_height): स्क्रीन = फ्रेम 1 प्रिंट ("कैम स्क्रीन 1 में गतिविधि"): स्क्रीन = फ्रेम 1 प्रिंट ("कैम स्क्रीन 2 में गतिविधि") (y <कैम_हाइट): स्क्रीन = फ़्रेम 1 प्रिंट ("कैम स्क्रीन 3 में गतिविधि"): स्क्रीन = फ्रेम 1 प्रिंट ("कैम स्क्रीन 4 में गतिविधि") वापसी (स्क्रीन)
मोशन डिटेक्शन के लिए अलार्म सेट करना
एक बार जब हम जान जाते हैं कि किस स्क्रीन, मोशन का पता लगाया गया है, तो हमें किसी भी प्रकार के अलार्म को जोड़ना आसान है। यहाँ हम GPIO 3 से जुड़े एक बजर को बीप करेंगे। अगर स्क्रीन 3 में गति का पता चला हो तो स्टेटमेंट चेक करता है और ट्रिग_लार्म नामक एक चर बढ़ाता है । आप अपनी पसंद के किसी भी स्क्रीन या कई स्क्रीन पर भी पता लगा सकते हैं।
यदि ((x> कैम_ एक्सपोज़र) और (y
यदि trig_alarm का मान 3 से अधिक तक पहुँच जाता है, तो हम एक बार बजर को बीप करेंगे। इस गिनती का कारण यह है कि कभी-कभी मैंने छाया पर ध्यान दिया या पक्षियों ने नकली अलार्म बनाया। तो इस तरह से अगर 3 फ्रेम के लिए एक निरंतर गतिविधि है, तो हम एक अलार्म प्राप्त करेंगे।
if (trig_alarm> = 3): # प्रतीक्षा के लिए 3 गतियों #Buzzer GPIO.output (BUZZER, 1) का समय।
सीपीयू तापमान और उपयोग की निगरानी
सिस्टम 24x7 काम करने के लिए प्रेरित है और इसलिए पाई बहुत गर्म हो सकती है, इसलिए मैं स्क्रीन पर उन मूल्यों को प्रदर्शित करके तापमान और सीपीयू उपयोग की निगरानी करने का निर्णय लेता हूं। हमने gpiozero लाइब्रेरी का उपयोग करके यह जानकारी प्राप्त की है।
cpu = CPUTENS () लोड = लोडअवरेज () cpu_tENS = str ((सीपीयू.टाइट्स) // 1) लोड_ऑवरटेज = str (लोड.लोड_ऑवरेज) #print (cpu.temper) #print (लोड. लोड_ऑवरेज) cv2.putText (डिस्प्ले_स्क्रीन), cpu_temper, (250,250), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0,0,255), 1) cv2.putText (display_screen, load_aaver (300,250), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (025)
अपने पाई सीसीटीवी मोशन डिटेक्टर को लॉन्च करना
मैंने इसे इकट्ठा करने के लिए दिनों का परीक्षण किया है और यह हर एक बार काम करता है और यह वास्तव में एक मजेदार निर्माण था जब तक कि मैंने एक कैमरा को क्षतिग्रस्त नहीं किया,