- Ρύθμιση του Raspberry Pi με Buster και OpenCV
- Προσθήκη Buzzer στην οθόνη Raspberry Pi 5Inch
- Προγραμματισμός Raspberry Pi για ανίχνευση κίνησης CCTV
- Ανίχνευση κίνησης στο OpenCV χρησιμοποιώντας το Raspberry Pi
- Ρύθμιση συναγερμού για ανίχνευση κίνησης
- Παρακολούθηση θερμοκρασίας και χρήσης CPU
- Εκκίνηση του Pi CCTV Motion Detector
Το OpenCV είναι ένα ισχυρό εργαλείο και αυτό σε συνδυασμό με το Raspberry Pi μπορεί να ανοίξει πόρτες σε πολλές φορητές έξυπνες συσκευές. Στο προηγούμενο άρθρο παρακολούθησης του Raspberry Pi CCTV, μάθαμε πώς να λαμβάνουμε ζωντανά βίντεο CCTV από ένα DVR χρησιμοποιώντας RTSP και να προβάλλουμε σε ένα Raspberry Pi, ελέγξτε το πριν προχωρήσετε. Σε αυτό το άρθρο, θα μάθουμε πώς να αξιοποιούμε τη δύναμη του OpenCV και να κατασκευάζουμε ένα σύστημα Raspberry Pi Motion Detection στα ζωντανά μας βίντεο CCTV. Εάν δεν έχετε εγκαταστήσει CCTV, μπορείτε να δημιουργήσετε ένα σύστημα παρακολούθησης Raspberry Pi συνδέοντας κάμερες USB απευθείας στο Pi σας. Και αν δεν είστε οπαδός των Pi και Python, μπορείτε να δημιουργήσετε κάτι παρόμοιο με το ESP32, ανατρέξτε στο ESP32 Wi-Fi Door Bell για περισσότερες λεπτομέρειες.
Θα γράψουμε ένα σενάριο python που μπορεί να παρακολουθεί και τις τέσσερις κάμερες CCTV ταυτόχρονα για οποιαδήποτε δραστηριότητα (κίνηση). Εάν εντοπιστεί μια δραστηριότητα σε οποιαδήποτε κάμερα, το Raspberry Pi θα αλλάξει αυτόματα σε αυτήν τη συγκεκριμένη οθόνη κάμερας και θα επισημάνει ποια δραστηριότητα έλαβε χώρα, όλα αυτά σε πραγματικό χρόνο με καθυστέρηση μόλις 1,5 δευτερολέπτου. Έχω προσθέσει επίσης ένα χαρακτηριστικό συναγερμού, όπως ένα βομβητή στο οποίο μπορεί να ειδοποιήσει τον χρήστη με ήχο αν εντοπιστεί κάποια δραστηριότητα. Αλλά μπορείτε εύκολα να το αυξήσετε για να στείλετε ένα μήνυμα ή ένα e-mail ή τι όχι! Συναρπαστικό δικαίωμα !! Ας αρχίσουμε
Ρύθμιση του Raspberry Pi με Buster και OpenCV
Χρησιμοποιώ το Raspberry Pi 3 B + με λειτουργικό σύστημα Buster OS και η έκδοση του OpenCV είναι 4.1. Εάν είστε εντελώς καινούργιοι, ακολουθήστε τα παρακάτω μαθήματα προτού ξεκινήσετε.
Ο στόχος είναι να έχετε το Pi σας έτοιμο για ανάπτυξη. Είναι εντάξει να έχετε οποιαδήποτε έκδοση του Raspbian OS στο Pi σας, αλλά βεβαιωθείτε ότι η έκδοση του OpenCV είναι 4.1 ή μεγαλύτερη. Μπορείτε είτε να ακολουθήσετε τον παραπάνω οδηγό για να μεταγλωττίσετε το OpenCV που θα διαρκέσει ώρες, αλλά είναι πιο αξιόπιστο για βαριά έργα ή απλά να το εγκαταστήσετε απευθείας από το pip χρησιμοποιώντας τις ακόλουθες εντολές.
$ pip install 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, μπορείτε επίσης να το ελέγξετε για περισσότερες εμπνεύσεις.
Προσθήκη Buzzer στην οθόνη Raspberry Pi 5Inch
Από την πλευρά του υλικού, δεν έχουμε πολλά άλλα από μια οθόνη 5 ιντσών και ένα Buzzer. Μετά τη διασύνδεση της οθόνης 5 ιντσών με το Raspberry Pi, μπορούμε να τοποθετήσουμε απευθείας τον βομβητή στο πίσω μέρος της οθόνης που έχει επεκτείνει μερικές καρφίτσες GPIO για εμάς. Έχω συνδέσει το Buzzer μου όπως φαίνεται παρακάτω-
Εάν ενδιαφέρεστε να χρησιμοποιήσετε περισσότερες καρφίτσες εισόδου / εξόδου, τότε θα είναι χρήσιμη η παρακάτω περιγραφή ακίδων. Όπως μπορείτε να δείτε μεταξύ των εκτεταμένων ακίδων, οι περισσότεροι από τους ακροδέκτες χρησιμοποιούνται από την ίδια την οθόνη για μια διεπαφή οθόνης αφής. Ωστόσο, έχουμε pin 3,5,7,8,10,11,12,13,15,16 και 24 που δεν έχουν καμία σύνδεση και μπορούμε να το χρησιμοποιήσουμε για τη δική μας εφαρμογή. Σε αυτό το σεμινάριο, έχω συνδέσει έναν βομβητή στο GPIO 3.
Προγραμματισμός Raspberry Pi για ανίχνευση κίνησης CCTV
Το πλήρες σενάριο python για αυτό το έργο βρίσκεται στο κάτω μέρος αυτής της σελίδας, αλλά ας συζητήσουμε κάθε τμήμα του κώδικα για να κατανοήσουμε πώς λειτουργεί.
Παρακολούθηση πολλαπλών καμερών χωρίς καθυστέρηση στο Raspberry Pi χρησιμοποιώντας RTSP
Το απαιτητικό κομμάτι στην κατασκευή αυτής της εργασίας ήταν να μειωθεί το φορτίο στο Raspberry pi για να αποφευχθεί καθυστέρηση στη ροή. Αρχικά, προσπάθησα να αλλάξω μεταξύ των τεσσάρων καμερών για να αναζητήσω κίνηση, αλλά ήταν πολύ καθυστερημένη (περίπου 10 δευτερόλεπτα). Έτσι συνδύαζα και τις τέσσερις κάμερες σε μία μόνο εικόνα και έκανα όλες τις κινήσεις ανίχνευσης δραστηριοτήτων σε αυτήν την εικόνα. Έγραψα δύο λειτουργίες, δηλαδή, να δημιουργήσω μια κάμερα και να διαβάσω κάμερα.
Η λειτουργία δημιουργίας κάμερας χρησιμοποιείται για το άνοιγμα της κάμερας με τον αντίστοιχο αριθμό καναλιού. Σημειώστε ότι η διεύθυνση URL RTSP τελειώνει με "02", που σημαίνει ότι χρησιμοποιώ τη ροή βίντεο δευτερεύουσας ροής, η οποία θα έχει χαμηλή ανάλυση και, ως εκ τούτου, ταχύτερη ανάγνωση. Επίσης, ο τύπος κωδικοποιητή βίντεο που χρησιμοποιείτε συμβάλλει επίσης στην ταχύτητα, πειραματίστηκα με διαφορετικούς κωδικούς και διαπίστωσα ότι η FFMPEG είναι η νηστεία όλων.
def create_camera (κανάλι): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Ροή / κανάλια /" + κανάλι + "02" # αλλάξτε την IP ώστε να ταιριάζει yours cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # Ο αριθμός ταυτότητας για πλάτος είναι 3 cap.set (4, cam_height) # Ο αριθμός ταυτότητας για ύψος είναι 480 cap.set (10, 100) # Ο αριθμός ταυτότητας για φωτεινότητα είναι 10 όριο επιστροφής
Στη λειτουργία ανάγνωσης κάμερας , θα διαβάσουμε και τις τέσσερις κάμερες, συγκεκριμένα τα cam1, cam2, cam3 και cam4 για να τα συνδυάσουμε όλα σε μία μόνο εικόνα που ονομάζεται Main_screen . Μόλις αυτή η κύρια οθόνη είναι έτοιμη, θα κάνουμε όλη μας την εργασία OpenCV σε αυτήν την εικόνα.
def read_camera (): επιτυχία, current_screen = cam1.read () Main_screen = current_screen επιτυχία, current_screen = cam2.read () Main_screen = current_screen επιτυχία, current_screen = cam3.read () Main_screen = current_screen επιτυχία, current_screen = cam4.read () Main_screen = current_screen return (Main_screen)
Η εικόνα της κύριας οθόνης σε συνδυασμό με τις τέσσερις κάμερες θα μοιάζει με την παρακάτω εικόνα.
Ανίχνευση κίνησης στο OpenCV χρησιμοποιώντας το Raspberry Pi
Τώρα που έχουμε την εικόνα έτοιμη, μπορούμε να ξεκινήσουμε με την ανίχνευση κίνησης. Μέσα στον βρόχο while , ξεκινάμε διαβάζοντας δύο διαφορετικά καρέ, δηλαδή, frame1 και frame2, και στη συνέχεια τα μετατρέπουμε σε κλίμακα του γκρι
frame1 = read_camera () # Διαβάστε το πρώτο πλαίσιο γκριImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Μετατροπή σε γκρι πλαίσιο2 = read_camera () # Διαβάστε το 2ο πλαίσιο γκριImage_F2 = cv2.cvtColor (frame2, c2
Στη συνέχεια, παίρνουμε τη διαφορά μεταξύ αυτών των δύο εικόνων για να δούμε τι έχει αλλάξει και με ένα κατώφλι, ομαδοποιούμε όλα τα μέρη που είχαν μια αλλαγή, κάπως σαν ένα blob. Είναι επίσης συνηθισμένο να θολώνετε και να διαστέλλετε την εικόνα για να αποφύγετε αιχμηρές άκρες.
diffImage = cv2.absdiff (greyImage_F1, greyImage_F2) # get the differenceance - This is cool blurImage = cv2.GussianBlur (diffImage, (5,5), 0) _, thresholdImage = cv2.threshold (blurImage, 20,255) dilatedImage = cv2.dilate (όριο εικόνας, πυρήνας, επαναλήψεις = 5)
Το επόμενο βήμα είναι να βρείτε μετρητές και να ελέγξετε την περιοχή κάθε μετρητή, βρίσκοντας την περιοχή, μπορούμε να καταλάβουμε πόσο μεγάλη είναι η κίνηση. Εάν η περιοχή είναι μεγαλύτερη από μια καθορισμένη τιμή στη μεταβλητή motion_detected , τότε το θεωρούμε ως δραστηριότητα και σχεδιάστε ένα πλαίσιο γύρω από την αλλαγή για να το επισημάνετε στον χρήστη.
περιγράμματα, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #four περίγραμμα είναι μια μαγική συνάρτηση για το περίγραμμα στα περιγράμματα: #για κάθε αλλαγή που εντοπίζεται (x, y, w, h) = cv2.boundingRect (περίγραμμα) #βρείτε την τοποθεσία όπου βρέθηκε αλλαγή εάν cv2.contourArea (περίγραμμα)> motion_threshold: cv2. ορθογώνιο (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") other: screen = frame1 print ("Activity in cam screen 2") άλλο: εάν (y <cam_height): screen = frame1 print ("Activity in cam screen 3") other: screen = frame1 print ("Activity in cam screen 4") επιστροφή (οθόνη)
Ρύθμιση συναγερμού για ανίχνευση κίνησης
Μόλις μάθουμε, σε ποια οθόνη, ανιχνεύεται κίνηση, είναι εύκολο να προσθέσετε οποιοδήποτε τύπο συναγερμού χρειαζόμαστε. Εδώ θα ηχήσει ένα ηχητικό σήμα που συνδέεται με GPIO 3. Το αν οι έλεγχοι δήλωση αν η κίνηση ανιχνεύτηκε σε οθόνη 3 και προσαυξήσεις μια μεταβλητή που ονομάζεται trig_alarm . Μπορείτε να εντοπίσετε οποιαδήποτε οθόνη της επιλογής σας ή ακόμα και σε πολλές οθόνες.
εάν ((x> εύρος_κμή) και (γ
Εάν η τιμή του trig_alarm φτάσει τα 3, θα ηχήσουμε έναν βομβητή μία φορά. Ο λόγος για αυτήν την καταμέτρηση είναι ότι μερικές φορές παρατήρησα σκιές ή πουλιά δημιούργησαν ψεύτικο συναγερμό. Έτσι, μόνο εάν υπάρχει συνεχής δραστηριότητα για 3 καρέ, θα λάβουμε έναν συναγερμό
if (trig_alarm> = 3): # Περιμένετε για 3 κινήσεις # Ακούστε το Buzzer GPIO.output (BUZZER, 1) time.sleep (0.02) GPIO.output (BUZZER, 0) trig_alarm = 0
Παρακολούθηση θερμοκρασίας και χρήσης CPU
Το σύστημα έχει εσοχή για να λειτουργεί 24x7 και ως εκ τούτου το Pi μπορεί να γίνει πολύ ζεστό, γι 'αυτό αποφασίζω να παρακολουθώ τη θερμοκρασία και τη χρήση της CPU, εμφανίζοντας αυτές τις τιμές στην οθόνη. Λάβαμε αυτές τις πληροφορίες χρησιμοποιώντας τη βιβλιοθήκη gpiozero.
cpu = CPUT θερμοκρασίας () 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), 2,2
Εκκίνηση του Pi CCTV Motion Detector
Το έχω δοκιμάσει για μέρες για να μαζέψω και λειτουργεί κάθε φορά και ήταν πραγματικά ένα διασκεδαστικό χτίσιμο μέχρι που έβλαψα μια κάμερα,