- Configurer Raspberry Pi avec Buster et OpenCV
- Ajout de buzzer à l'écran Raspberry Pi 5 pouces
- Programmation de Raspberry Pi pour la détection de mouvement CCTV
- Détection de mouvement sur OpenCV à l'aide de Raspberry Pi
- Réglage de l'alarme pour la détection de mouvement
- Surveillance de la température et de l'utilisation du processeur
- Lancement de votre détecteur de mouvement Pi CCTV
OpenCV est un outil puissant et cela combiné avec Raspberry Pi peut ouvrir des portes à de nombreux appareils intelligents portables. Dans notre précédent article sur la surveillance CCTV Raspberry Pi, nous avons appris comment obtenir une vidéo CCTV en direct à partir d'un DVR utilisant RTSP et l'afficher sur un Raspberry Pi, vérifiez cela avant de continuer. Dans cet article, nous allons apprendre à tirer parti de la puissance d'OpenCV et à créer un système de détection de mouvement Raspberry Pi sur nos séquences de vidéosurveillance en direct. Si vous n'avez pas installé de vidéosurveillance, vous pouvez toujours créer un système de surveillance Raspberry Pi en connectant des caméras USB directement à votre Pi. Et si vous n'êtes pas un grand fan de Pi et Python, vous pouvez créer quelque chose de similaire avec ESP32, reportez-vous à ESP32 Wi-Fi Door Bell pour plus de détails.
Nous allons écrire un script python qui peut surveiller les quatre caméras CCTV simultanément pour toutes les activités (mouvement). Si une activité est détectée sur une caméra, notre Raspberry Pi passera automatiquement à cet écran de caméra particulier et mettra en évidence l'activité qui a eu lieu, tout cela en temps réel avec un décalage de seulement 1,5 seconde. J'ai également ajouté une fonction d'alarme, comme un buzzer qui peut alerter l'utilisateur en émettant un bip si une activité est détectée. Mais vous pouvez facilement augmenter cela pour envoyer un message ou un e-mail ou que sais-je encore! Excitant droit !! Commençons
Configurer Raspberry Pi avec Buster et OpenCV
J'utilise le Raspberry Pi 3 B + avec Buster OS et la version d'OpenCV est 4.1. Si vous êtes complètement nouveau, suivez les didacticiels ci-dessous avant de pouvoir commencer.
L'objectif est d'avoir votre Pi prêt pour le développement. Il est normal d'avoir n'importe quelle version de Raspbian OS sur votre Pi, mais assurez-vous que la version d'OpenCV est 4.1 ou supérieure. Vous pouvez suivre le tutoriel ci-dessus pour compiler votre OpenCV qui prendra des heures mais qui est plus fiable pour les projets lourds ou simplement l'installer directement à partir de pip en utilisant les commandes suivantes.
$ pip install opencv-contrib-python == 4.1.0.25
Si vous installez OpenCV avec pip pour la première fois, vous devez également installer les autres dépendances. Utilisez les commandes ci-dessous pour cela.
$ 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 installer libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
Nous avons déjà construit de nombreux projets Raspberry Pi OpenCV, vous pouvez également vérifier cela pour plus d'inspirations.
Ajout de buzzer à l'écran Raspberry Pi 5 pouces
Côté matériel, nous n'avons pas grand chose d'autre qu'un écran de 5 pouces et un buzzer. Après avoir interfacé l'écran de 5 pouces avec le Raspberry Pi, nous pouvons directement monter le buzzer à l'arrière de l'écran, ce qui a étendu certaines broches GPIO pour nous. J'ai connecté mon buzzer comme indiqué ci-dessous -
Si vous souhaitez utiliser plus de broches d'E / S, la description des broches ci-dessous vous sera utile. Comme vous pouvez le voir parmi les broches étendues, la plupart des broches sont utilisées par l'écran lui-même pour une interface d'écran tactile. Mais quand même, nous avons des broches 3, 5, 7, 8, 10, 11, 12, 13, 15, 16 et 24 qui n'ont pas de connexion et nous pouvons les utiliser pour notre propre application. Dans ce tutoriel, j'ai connecté un buzzer à GPIO 3.
Programmation de Raspberry Pi pour la détection de mouvement CCTV
Le script python complet de ce projet se trouve au bas de cette page, mais discutons de chaque segment du code pour comprendre son fonctionnement.
Surveillance de plusieurs caméras sans décalage sur Raspberry Pi à l'aide de RTSP
Le défi dans ce travail était de réduire la charge sur Raspberry pi pour éviter un décalage dans le streaming. Au départ, j'ai essayé de basculer entre les quatre caméras pour rechercher un mouvement, mais c'était très lent (environ 10 secondes). J'ai donc combiné les quatre caméras en une seule image et effectué toutes les activités de détection de mouvement sur cette image. J'ai écrit deux fonctions, à savoir, créer une caméra et lire une caméra.
La fonction de création de caméra est utilisée pour ouvrir la came avec son numéro de canal respectif. Notez que l'URL RTSP se termine par «02», ce qui signifie que j'utilise le flux vidéo de sous-flux qui sera de faible résolution et donc plus rapide à lire. En outre, le type de codec vidéo que vous utilisez contribue également à la vitesse, j'ai expérimenté différents codes et j'ai trouvé que FFMPEG était le jeûné de tous.
def create_camera (channel): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / channels /" + channel + "02" #changez l'adresse IP en conséquence yours cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # Le numéro d'identification pour la largeur est de 3 cap.set (4, cam_height) # Le numéro d'identification pour la hauteur est de 480 cap.set (10, 100) # Le numéro d'identification pour la luminosité est de 10 cap de retour
Dans la fonction de lecture de la caméra , nous lirons les quatre cames, à savoir cam1, cam2, cam3 et cam4 pour les combiner toutes en une seule image appelée Main_screen . Une fois cet écran principal prêt, nous ferons tout notre travail OpenCV sur cette image.
def read_camera (): success, 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 = current_screen return (Main_screen)
L'image de l'écran principal avec les quatre cames combinées ressemblera à l'image ci-dessous.
Détection de mouvement sur OpenCV à l'aide de Raspberry Pi
Maintenant que l'image est prête, nous pouvons commencer par notre détection de mouvement. À l'intérieur de la boucle while , nous commençons par lire deux images différentes à savoir, frame1 et frame2, puis les convertissons en niveaux de gris
frame1 = read_camera () #Lire le premier cadre grayImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Convertir en gris frame2 = read_camera () #Lire le 2e cadre grayImage_F2 = cv2.cvtColor (frame2, cv2.COLOR_BGR2GRAY)
Ensuite, nous faisons une différence entre ces deux images pour voir ce qui a changé et avec un seuil, nous regroupons tous les endroits qui ont eu un changement, un peu comme une goutte. Il est également courant de flouter et de dilater l'image pour éviter les bords nets.
diffImage = cv2.absdiff (grayImage_F1, grayImage_F2) #get la différence - c'est cool blurImage = cv2.GaussianBlur (diffImage, (5,5), 0) _, thresholdImage = cv2.threshold (blurImage, 20,255, cv2.THRESH_BINARY) dilatedImage = cv2.dilate (seuilImage, kernal, itérations = 5)
L'étape suivante consiste à trouver des compteurs et à vérifier la zone de chaque compteur, en trouvant la zone, nous pouvons déterminer l'ampleur du mouvement. Si la zone est plus grande qu'une valeur spécifiée dans la variable motion_detected , alors nous considérons cela comme une activité et dessinons une boîte autour du changement pour le mettre en évidence à l'utilisateur.
contours, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find contour est une fonction magique pour le contour dans les contours: #for chaque changement détecté (x, y, w, h) = cv2.boundingRect (contour) #get l'emplacement où le changement a été trouvé si cv2.contourArea (contour)> motion_threshold: cv2.rectangle (frame1, (x, y), (x + w, y + h), (255, 255, 0), 1) display_screen = find_screen ()
La fonction find_screen () est utilisée pour trouver où l'activité a eu lieu parmi les quatre caméras. Nous pouvons trouver cela puisque nous connaissons les valeurs x et y du mouvement. Nous comparons ces valeurs x et y à l'emplacement de chaque écran pour trouver quel écran a donné une activité et nous recadrons à nouveau cet écran particulier, afin de pouvoir l'afficher sur l'écran tactile 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)
Réglage de l'alarme pour la détection de mouvement
Une fois que nous savons, dans quel écran, le mouvement est détecté, il est facile d'ajouter tout type d'alarme dont nous avons besoin. Ici, nous émettrons un signal sonore connecté à GPIO 3. L' instruction if vérifie si le mouvement a été détecté dans l'écran 3 et incrémente une variable appelée trig_alarm . Vous pouvez détecter n'importe quel écran de votre choix ou même sur plusieurs écrans.
si ((x> cam_width) et (y
Si la valeur de trig_alarm atteint plus de 3, nous émettrons un signal sonore une fois. La raison de ce décompte est que parfois j'ai remarqué que des ombres ou des oiseaux créaient une fausse alarme. Donc de cette façon seulement s'il y a une activité continue pendant 3 images, nous obtiendrons une alarme.
if (trig_alarm> = 3): # wait for conts 3 mouvements #Beep the Buzzer GPIO.output (BUZZER, 1) time.sleep (0.02) GPIO.output (BUZZER, 0) trig_alarm = 0
Surveillance de la température et de l'utilisation du processeur
Le système est en retrait pour fonctionner 24x7 et donc le Pi peut devenir très chaud, alors je décide de surveiller la température et l'utilisation du processeur en affichant ces valeurs à l'écran. Nous avons obtenu ces informations en utilisant la bibliothèque 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)
Lancement de votre détecteur de mouvement Pi CCTV
J'ai testé cela pendant des jours pour rassembler et cela fonctionne à chaque fois et c'était vraiment une construction amusante jusqu'à ce que j'endommage une caméra,