- إعداد Raspberry Pi باستخدام Buster و OpenCV
- إضافة الجرس إلى شاشة Raspberry Pi 5 بوصة
- برمجة Raspberry Pi لكشف حركة الدوائر التلفزيونية المغلقة
- كشف الحركة على OpenCV باستخدام Raspberry Pi
- ضبط المنبه لكشف الحركة
- مراقبة درجة حرارة وحدة المعالجة المركزية واستخدامها
- إطلاق كاشف الحركة Pi CCTV
OpenCV هي أداة قوية ويمكن أن تفتح مع Raspberry Pi الأبواب للعديد من الأجهزة الذكية المحمولة. في مقالنا السابق حول مراقبة Raspberry Pi CCTV ، تعلمنا كيفية الحصول على فيديو CCTV مباشر من DVR باستخدام RTSP وعرضه على Raspberry Pi ، تحقق من ذلك قبل المتابعة. في هذه المقالة ، سوف نتعلم كيفية الاستفادة من قوة OpenCV وبناء نظام Raspberry Pi Motion Detection على لقطات كاميرات المراقبة الحية. إذا لم يكن لديك CCTV مثبتًا ، فلا يزال بإمكانك إنشاء نظام Raspberry Pi Surveillance عن طريق توصيل كاميرات USB مباشرة بـ Pi الخاص بك. وإذا لم تكن من كبار المعجبين بـ Pi و Python ، يمكنك بناء شيء مشابه لـ ESP32 ، راجع ESP32 Wi-Fi Door Bell لمزيد من التفاصيل.
سنقوم بكتابة برنامج نصي بيثون يمكنه مراقبة جميع كاميرات الدوائر التلفزيونية المغلقة الأربعة في وقت واحد لأي أنشطة (حركة). إذا تم الكشف عن نشاط على أي كاميرا ، فإن Raspberry Pi الخاص بنا سيتغير تلقائيًا إلى شاشة الكاميرا المحددة هذه ويبرز النشاط الذي حدث ، كل هذا في الوقت الفعلي بفارق 1.5 ثانية فقط. لقد أضفت أيضًا ميزة تنبيه ، مثل الجرس الذي يمكنه تنبيه المستخدم عن طريق التنبيه إذا تم اكتشاف نشاط. ولكن يمكنك بسهولة توسيع نطاق هذا لإرسال رسالة أو بريد إلكتروني أو ما لا! حق مثير !! هيا بنا نبدأ
إعداد Raspberry Pi باستخدام Buster و OpenCV
أنا أستخدم Raspberry Pi 3 B + مع نظام تشغيل Buster OS وإصدار OpenCV هو 4.1. إذا كنت جديدًا تمامًا ، فاتبع البرامج التعليمية أدناه قبل أن تبدأ.
الهدف هو الحصول على Pi الخاص بك وجاهزًا للتطوير. من المقبول أن يكون لديك أي إصدار من Raspbian OS على Pi الخاص بك ولكن تأكد من أن إصدار OpenCV هو 4.1 أو أحدث. يمكنك إما اتباع البرنامج التعليمي أعلاه لتجميع OpenCV الخاص بك والذي سيستغرق ساعات ولكنه أكثر موثوقية للمشاريع الثقيلة أو فقط تثبيته مباشرة من نقطة باستخدام الأوامر التالية.
تثبيت $ Pip opencv-Contrib-python == 4.1.0.25
إذا كنت تقوم بتثبيت OpenCV مع pip لأول مرة ، فيجب عليك أيضًا تثبيت التبعيات الأخرى. استخدم الأوامر أدناه لذلك.
$ 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
لقد قمنا بالفعل ببناء العديد من مشاريع Raspberry Pi OpenCV ، يمكنك أيضًا التحقق من ذلك لمزيد من الإلهام.
إضافة الجرس إلى شاشة Raspberry Pi 5 بوصة
من ناحية الأجهزة ، ليس لدينا الكثير بخلاف شاشة 5 بوصة وجرس. بعد توصيل شاشة مقاس 5 بوصات مع Raspberry Pi ، يمكننا تركيب الجرس مباشرةً على الجانب الخلفي من الشاشة مما أدى إلى تمديد بعض دبابيس GPIO لنا. لقد قمت بتوصيل الجرس الخاص بي كما هو موضح أدناه-
إذا كنت مهتمًا باستخدام المزيد من دبابيس الإدخال / الإخراج ، فسيكون وصف الدبوس أدناه مفيدًا. كما ترى من بين المسامير الممتدة ، يتم استخدام معظم المسامير بواسطة شاشة العرض نفسها لواجهة شاشة تعمل باللمس. ولكن لا يزال لدينا دبابيس 3،5،7،8،10،11،12،13،15،16 و 24 التي ليس لها اتصال ويمكننا استخدامها لتطبيقنا الخاص. في هذا البرنامج التعليمي ، قمت بتوصيل الجرس بـ GPIO 3.
برمجة Raspberry Pi لكشف حركة الدوائر التلفزيونية المغلقة
يمكن العثور على نص Python الكامل لهذا المشروع في أسفل هذه الصفحة ، لكن دعنا نناقش كل جزء من الكود لفهم كيفية عمله.
مراقبة كاميرات متعددة دون تأخير على Raspberry Pi باستخدام RTSP
كان الجزء الصعب في القيام بهذا العمل هو تقليل الحمل على Raspberry pi لتجنب حدوث تأخير في التدفق. في البداية ، حاولت التبديل بين جميع الكاميرات الأربع للبحث عن الحركة لكنها كانت بطيئة جدًا (حوالي 10 ثوانٍ). لذا جمعت الكاميرات الأربع في صورة واحدة وقمت بكل أنشطة اكتشاف الحركة على تلك الصورة. لقد كتبت وظيفتين ، وهما إنشاء الكاميرا وقراءة الكاميرا.
و خلق الكاميرا يتم استخدام الدالة لفتح كام مع رقم القناة الخاصة به. لاحظ أن عنوان URL لـ RTSP ينتهي بـ "02" ، مما يعني أنني أستخدم تغذية الفيديو الفرعية التي ستكون منخفضة الدقة وبالتالي أسرع في القراءة. أيضًا ، نوع برنامج ترميز الفيديو الذي تستخدمه يساهم أيضًا في السرعة ، لقد جربت رموزًا مختلفة ووجدت أن FFMPEG هو الصيام للجميع.
def create_camera (channel): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / channels /" + channel + "02" # تغيير عنوان IP ليناسب yours cap = cv2.VideoCapture (rtsp، cv2.CAP_FFMPEG) cap.set (3، cam_width) # رقم معرف للعرض هو 3 أغطية. set (4، cam_height) # رقم معرف للارتفاع هو 480 مجموعة (10 ، 100) # رقم معرف للسطوع هو 10 غطاء إرجاع
في الكاميرا قراءة وظيفة، سنقرأ كل الحدبات الأربع وهي cam1، CAM2، cam3، وأفلام Cam4 تتضافر جميعا في صورة واحدة تسمى Main_screen . بمجرد أن تصبح هذه الشاشة الرئيسية جاهزة ، سنقوم بجميع أعمال OpenCV الخاصة بنا على هذه الصورة.
def read_camera (): النجاح ، current_screen = cam1.read () Main_screen = current_screen Success ، current_screen = cam2.read () Main_screen = current_screen Success ، current_screen = cam3.read () Main_screen = current_screen Success ، current_screen = cam4.read () Main_screen = إرجاع الشاشة الحالية (Main_screen)
ستبدو صورة الشاشة الرئيسية مع جميع الكاميرات الأربع مجتمعة مثل الصورة الموضحة أدناه.
كشف الحركة على OpenCV باستخدام Raspberry Pi
الآن بعد أن أصبحت الصورة جاهزة ، يمكننا البدء باكتشاف الحركة. داخل حلقة while ، نبدأ بقراءة إطارين مختلفين هما الإطار 1 والإطار 2 ، ثم نحولهما إلى التدرج الرمادي
frame1 = read_camera () #Read the first frame grayImage_F1 = cv2.cvtColor (frame1، cv2.COLOR_BGR2GRAY) # تحويل إلى إطار رمادي 2 = read_camera () #Read the 2nd frame grayImage_F2 = cv2.cvtColor (frame2، cv2.COLRAY)
ثم نأخذ فرقًا بين هاتين الصورتين لنرى ما الذي تغير ومع العتبة ، نقوم بتجميع كل الأماكن التي تغيرت ، مثل النقطة. ومن الشائع أيضًا أن يتم تعتيم الصورة وتوسيعها لتجنب الحواف الحادة.
diffImage = cv2.absdiff (grayImage_F1، grayImage_F2) # احصل على الاختلاف - هذا بارد blurImage = cv2.GaussianBlur (diffImage، (5،5)، 0) _، thresholdImage = cv2.threshold (blurImage، 20،255، cv2.THRESH_BARY)) dilatedImage = cv2.dilate (thresholdImage، kernal، iterations = 5)
الخطوة التالية هي إيجاد العدادات والتحقق من مساحة كل عداد ، من خلال إيجاد المساحة ، يمكننا معرفة حجم الحركة. إذا كانت المساحة أكبر من قيمة محددة في المتغير motion_detected ، فإننا نعتبر ذلك نشاطًا ونرسم مربعًا حول التغيير لإبرازه للمستخدم.
contours، _ = cv2.findContours (dilatedImage، cv2.RETR_TREE، cv2.CHAIN_APPROX_SIMPLE) #Find contour هي وظيفة سحرية لمحيط الكنتور: # لكل تغيير يتم اكتشافه (x، y، w، h) = cv2.boundingRect (كفاف) # احصل على الموقع الذي تم العثور فيه على التغيير إذا كان cv2.contourArea (كفاف)> motion_threshold: cv2.rectangle (frame1، (x، y)، (x + w، y + h)، (255، 255، 0) ، 1) display_screen = find_screen ()
تُستخدم الوظيفة find_screen () للعثور على مكان حدوث النشاط بين الكاميرات الأربع. يمكننا إيجاد ذلك بما أننا نعرف قيمتي x و y للحركة. نقارن قيمتي x و y بموقع كل شاشة للعثور على الشاشة التي أعطت نشاطًا ونقوم مرة أخرى بقص تلك الشاشة المعينة ، حتى نتمكن من عرضها على شاشة اللمس pi.
def find_screen (): if (x <cam_width): if (y <cam_height): screen = frame1 print ("Activity in cam screen 1") else: screen = frame1 print ("Activity in cam screen 2") else: if (y <cam_height): screen = frame1 print ("Activity in cam screen 3") else: screen = frame1 print ("Activity in cam screen 4") return (screen)
ضبط المنبه لكشف الحركة
بمجرد أن نعرف ، في أي شاشة ، يتم اكتشاف الحركة ، من السهل إضافة أي نوع من التنبيه نحتاج إليه. ونحن هنا سوف زمارة الجرس متصلة GPIO 3. إذا الشيكات بيان إذا تم الكشف عن الحركة في الشاشة 3 والزيادات متغير يسمى trig_alarm . يمكنك اكتشاف أي شاشة من اختيارك أو حتى على شاشات متعددة.
إذا ((x> cam_width) و (y
إذا وصلت قيمة trig_alarm إلى أكثر من 3 ، فسنصدر صفيرًا مرة واحدة. والسبب في هذا العد هو أنني لاحظت أحيانًا أن الظلال أو الطيور تخلق إنذارًا مزيفًا. وبهذه الطريقة فقط إذا كان هناك نشاط مستمر لمدة 3 إطارات ، فسنحصل على إنذار.
إذا كان (
مراقبة درجة حرارة وحدة المعالجة المركزية واستخدامها
تم وضع مسافة بادئة للنظام للعمل على مدار 24 ساعة طوال أيام الأسبوع ، وبالتالي يمكن أن يصبح Pi شديد الحرارة ، لذلك قررت مراقبة درجة الحرارة واستخدام وحدة المعالجة المركزية من خلال عرض هذه القيم على الشاشة. لقد حصلنا على هذه المعلومات باستخدام مكتبة gpiozero.
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)
إطلاق كاشف الحركة Pi CCTV
لقد اختبرت هذا لعدة أيام للتجميع وهو يعمل في كل مرة وكان حقًا تصميمًا ممتعًا حتى أتلف كاميرا واحدة ،