- הגדרת Raspberry Pi עם Buster ו- OpenCV
- הוספת זמזם לתצוגה 5 אינץ 'של פטל
- תכנות פטל פאי לזיהוי תנועה במעגל סגור
- זיהוי תנועה ב- OpenCV באמצעות Raspberry Pi
- הגדרת אזעקה לזיהוי תנועה
- ניטור טמפרטורת המעבד ושימושו
- משיק את גלאי התנועה של טלוויזיה במעגל סגור
OpenCV הוא כלי רב עוצמה ושילוב עם Raspberry Pi יכול לפתוח דלתות למכשירים חכמים ניידים רבים. במאמר הקודם שלנו בנושא ניטור טלוויזיה במעגל סגור של Raspberry Pi, למדנו כיצד להשיג וידאו CCTV חי מ- DVR באמצעות RTSP ולהציג אותו ב- Raspberry Pi, בדוק זאת לפני שתמשיך. במאמר זה נלמד כיצד למנף את העוצמה של OpenCV ולבנות מערכת איתור תנועה של Raspberry Pi על גבי קטעי ה- CCTV החיים שלנו. אם אין לך טלוויזיה במעגל סגור מותקן, אתה עדיין יכול לבנות מערכת מעקב Raspberry Pi על ידי חיבור מצלמות USB ישירות ל- Pi שלך. ואם אתה לא אוהד גדול של Pi ו- Python, אתה יכול לבנות משהו דומה עם ESP32, עיין ב ESP32 Wi-Fi Door Bell לקבלת פרטים נוספים.
נכתוב סקריפט פיתון שיכול לפקח על כל ארבע מצלמות ה- CCTV בו זמנית לכל פעילות (תנועה). אם מזוהה פעילות במצלמה כלשהי, ה- Raspberry Pi שלנו ישתנה אוטומטית למסך המצלמה המסוים הזה וידגיש איזו פעילות התרחשה, כל זאת בזמן אמת עם פיגור של 1.5 שניות בלבד. הוספתי גם תכונת אזעקה, כמו זמזם שאליו הוא יכול להזהיר את המשתמש על ידי צפצוף אם מתגלה פעילות. אבל אתה יכול בקלות להגדיל את זה כדי לשלוח הודעה או דואר אלקטרוני או מה לא! נכון מרגש !! בוא נתחיל
הגדרת Raspberry Pi עם Buster ו- OpenCV
אני משתמש ב- Raspberry Pi 3 B + עם מערכת ההפעלה של באסטר פועלת עליו והגרסה של OpenCV היא 4.1. אם אתה חדש לחלוטין, עקוב אחר ההדרכות למטה לפני שתוכל להתחיל.
המטרה היא ש- Pi שלך יהיה מוכן ומוכן להתפתחות. זה בסדר שיש גרסה כלשהי של מערכת ההפעלה Raspbian ב- Pi שלך, אך וודא שגרסת OpenCV היא 4.1 ומעלה. אתה יכול לעקוב אחר ההדרכה לעיל כדי להרכיב את OpenCV שלך שייקח שעות אך הוא אמין יותר לפרויקטים כבדים או פשוט להתקין אותו ישירות מ- pip באמצעות הפקודות הבאות.
$ 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, תוכלו לבדוק זאת לקבלת השראות נוספות.
הוספת זמזם לתצוגה 5 אינץ 'של פטל
בצד החומרה, אין לנו הרבה מלבד תצוגת 5 אינץ 'וזמזם. לאחר ממשק תצוגת 5 אינץ 'עם פטל פטל, אנו יכולים לעלות ישירות את הבאזר על צידו האחורי של הצג אשר הרחיב עבורנו כמה סיכות GPIO. חיברתי את הבאזר שלי כפי שמוצג להלן-
אם אתה מעוניין להשתמש בסיכות קלט / פלט נוספות, תיאור הסיכה שלהלן יהיה שימושי. כפי שניתן לראות בין הפינים המורחבים, רוב הפינים מנוצלים על ידי התצוגה עצמה לממשק עם מסך מגע. אבל עדיין, יש לנו סיכות 3,5,7,8,10,11,12,13,15,16 ו- 24 שאין להם קשר ואנחנו יכולים להשתמש בו ליישום שלנו. במדריך זה חיברתי זמזם ל- GPIO 3.
תכנות פטל פאי לזיהוי תנועה במעגל סגור
סקריפט הפיתון המלא לפרויקט זה נמצא בתחתית עמוד זה, אך בואו נדון בכל קטע בקוד כדי להבין כיצד הוא עובד.
ניטור מצלמות מרובות ללא פיגור ב- Raspberry Pi באמצעות RTSP
החלק המאתגר ביצירת עבודה זו היה הפחתת העומס על פטל פטל כדי למנוע פיגור בזרם. בתחילה, ניסיתי לעבור בין כל ארבע המצלמות כדי לחפש תנועה אבל זה היה מאוד לאגי (בערך 10 שניות). אז שילבתי את כל ארבע המצלמות לתמונה אחת ועשיתי את כל הפעילויות שזיהו את התנועה על אותה תמונה. כתבתי שתי פונקציות, כלומר ליצור מצלמה ולקרוא מצלמה.
מצלמה ליצור פונקציה משמשת כדי לפתוח את המצלמת עם מספר הערוץ שלו בהתאמה. שים לב שכתובת האתר של RTSP מסתיימת ב- "02", כלומר אני משתמש בעדכון הווידאו של זרם המשנה שיהיה ברזולוציה נמוכה ומכאן מהיר יותר לקריאה. כמו כן, סוג ה- codec וידאו בו אתה משתמש תורם גם למהירות, התנסיתי בקודים שונים ומצאתי ש- FFMPEG הוא הצום של כולם.
def create_camera (ערוץ): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / סטרימינג / ערוצים /" + ערוץ + "02" # שנה את ה- IP כך שיתאים הכובע שלך = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # ID מזהה לרוחב הוא 3 cap.set (4, cam_height) # ID מזהה לגובה הוא 480 cap.set (10, 100 מספר המספר מזהה עבור בהירות הוא 10 מכסה חזרה
ב המצלמה קריאה לפונקציה, נוכל לקרוא את כל ארבע מצלמות כלומר cam1, cam2, cam3, ו cam4 לשלב את כולם לתוך תמונה אחת בשם Main_screen . לאחר שהמסך הראשי הזה מוכן, אנו נעשה את כל עבודות OpenCV שלנו על תמונה זו.
def read_camera (): success, current_screen = cam1.read () Main_screen = current_screen success, current_screen = cam2.read () Main_screen = current_screen הצלחה, current_screen = cam3.read () Main_screen = current_screen success, current_screen = cam4.read () Main_screen = current_screen return (Main_screen)
תמונת המסך הראשית עם כל ארבעת המצלמות המשולבות תיראה כמו התמונה המוצגת למטה.
זיהוי תנועה ב- OpenCV באמצעות Raspberry Pi
כעת, לאחר שהתמונה מוכנה, אנו יכולים להתחיל בזיהוי התנועה שלנו. בתוך לולאת הזמן אנו מתחילים בקריאה של שתי מסגרות שונות, כלומר מסגרת 1 ומסגרת 2, ואז ממירים אותן לסולם אפור
frame1 = read_camera () # קרא את המסגרת הראשונה אפור Image_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # המר למסגרת אפור 2 = read_camera () # קרא את המסגרת השנייה אפור Image_F2 = cv2.cvtColor (frame2, cv2GR
ואז אנו מבחינים בהבדל בין שתי התמונות הללו כדי לראות מה השתנה ועם סף, אנו מקבצים את כל המקומות שהיו בהם שינוי, כמו כתם. מקובל לטשטש ולהרחיב את התמונה כדי למנוע קצוות חדים.
diffImage = cv2.absdiff (greyImage_F1, greyimage_F2) # קבל את ההבדל - זה מגניב blurImage = cv2. GaussianBlur (diffImage, (5,5), 0) _, thresholdImage = cv2. סף (blurImage, 20,255ES, cv2) dilatedImage = cv2.dilate (thresholdImage, kernal, iterations = 5)
השלב הבא הוא למצוא דלפקים ולבדוק את השטח של כל דלפק, על ידי מציאת השטח, נוכל להבין עד כמה התנועה גדולה. אם האזור גדול מערך מוגדר במשתנה motion_detected , אנו רואים זאת כפעילות ומציירים תיבה סביב השינוי כדי להדגיש אותו בפני המשתמש.
קווי מתאר, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) קווי המתאר #find הם פונקציית קסם לקווי המתאר: # לכל שינוי שזוהה (x, y, w, h) = cv2.boundingRect (קו מתאר) # קבל את המיקום שבו נמצא שינוי אם cv2.contourArea (קו מתאר)> תנועת_סף: 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 ("פעילות במסך פקה 1") אחר: screen = frame1 print ("פעילות במסך פקה 2") אחר: if (y <cam_height): מסך = הדפסת מסגרת 1 ("פעילות במסך פקה 3") אחר: מסך = הדפסת מסגרת 1 ("פעילות במסך פקה 4") חזרה (מסך)
הגדרת אזעקה לזיהוי תנועה
ברגע שאנחנו יודעים, באיזה מסך מתגלה תנועה, קל להוסיף כל סוג של אזעקה שאנחנו צריכים. כאן נשמיע צפצוף על זמזם המחובר ל- GPIO 3. הצהרת ה- if בודקת אם התנועה אותרה במסך 3 ומגדילה משתנה הנקרא trig_alarm . אתה יכול לזהות כל מסך לפי בחירתך או אפילו במסכים מרובים.
אם ((x> רוחב cam) ו- (y
אם הערך של trig_alarm יגיע ליותר מ -3, נשמיע צפצוף על זמזם פעם אחת. הסיבה לספירה זו היא שלפעמים הבחנתי בצללים או ציפורים שיצרו אזעקת מזויף. אז ככה רק אם תהיה פעילות רציפה ל -3 פריימים, נקבל אזעקה.
אם (trig_alarm> = 3): # המתן להמרות 3 תנועות # שמור על פלט ה- GPIO של זמזם (BUZZER, 1) time.sleep (0.02) פלט של GPIO (BUZZER, 0) trig_alarm = 0
ניטור טמפרטורת המעבד ושימושו
המערכת מוטעת לעבוד 24x7 ומכאן שה- 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)
משיק את גלאי התנועה של טלוויזיה במעגל סגור
בדקתי את זה במשך כמה ימים כדי להתכנס וזה עובד כל פעם וזה היה ממש כיף עד שפגעתי במצלמה אחת,