Initial commit
This commit is contained in:
5
OpenCV/tutoriel26/README.md
Normal file
5
OpenCV/tutoriel26/README.md
Normal file
@@ -0,0 +1,5 @@
|
||||
# Tutoriel OpenCV
|
||||
## Caméra de surveillance
|
||||
|
||||
La vidéo du tutoriel est à l'adresse:
|
||||
https://www.youtube.com/watch?v=2JaXsL0pUzo
|
||||
108
OpenCV/tutoriel26/camera.py
Normal file
108
OpenCV/tutoriel26/camera.py
Normal file
@@ -0,0 +1,108 @@
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import numpy as np
|
||||
import cv2
|
||||
|
||||
# mode global=1 local=0
|
||||
mode=1
|
||||
label_mode=["local", "global"]
|
||||
kernel_blur=3
|
||||
seuil=15
|
||||
seuil_nbr_pixel=5000
|
||||
dir_videos="d:\\enregistrements\\"
|
||||
|
||||
couleur_fond =(100, 100, 100)
|
||||
couleur_infos =(255, 255, 255)
|
||||
couleur_alarme =( 0, 0, 255)
|
||||
couleur_fin_alarme=( 0, 128, 255)
|
||||
|
||||
cap=cv2.VideoCapture(1)
|
||||
ret, originale=cap.read()
|
||||
if ret is False:
|
||||
quit()
|
||||
|
||||
hauteur, largeur, nbr_couche=originale.shape
|
||||
tab_hauteur=50
|
||||
|
||||
originale=cv2.cvtColor(originale, cv2.COLOR_BGR2GRAY)
|
||||
originale=cv2.GaussianBlur(originale, (kernel_blur, kernel_blur), 0)
|
||||
|
||||
kernel_dilate=np.ones((3, 3), np.uint8)
|
||||
tab=np.zeros((largeur), dtype=np.int32)
|
||||
image_finale=np.zeros((hauteur+tab_hauteur, largeur, nbr_couche), dtype=np.uint8)
|
||||
fichier_video=None
|
||||
|
||||
if not os.path.isdir(dir_videos):
|
||||
os.mkdir(dir_videos)
|
||||
|
||||
fin_mouvement=40
|
||||
cpt_fin_mouvement=0
|
||||
|
||||
while True:
|
||||
alarme=0
|
||||
ret, frame=cap.read()
|
||||
if ret is False:
|
||||
quit()
|
||||
image_finale[:hauteur, :, :]=frame
|
||||
gray=cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
||||
gray_blur=cv2.GaussianBlur(gray, (kernel_blur, kernel_blur), 0)
|
||||
mask=cv2.absdiff(originale, gray_blur)
|
||||
mask=cv2.threshold(mask, seuil, 255, cv2.THRESH_BINARY)[1]
|
||||
if mode==0:
|
||||
mask=cv2.dilate(mask, kernel_dilate, iterations=2)
|
||||
contours, hierarchy=cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
|
||||
if hierarchy is not None:
|
||||
c=max(contours, key=cv2.contourArea)
|
||||
nbr_pixel=int(cv2.contourArea(c))
|
||||
couleur=(0, 0, 255) if nbr_pixel>seuil_nbr_pixel else (0, 255, 0)
|
||||
cv2.drawContours(image_finale, [c], 0, couleur, 3)
|
||||
if nbr_pixel>seuil_nbr_pixel:
|
||||
alarme=1
|
||||
else:
|
||||
nbr_pixel=int(np.sum(mask)/255)
|
||||
if nbr_pixel>seuil_nbr_pixel:
|
||||
alarme=1
|
||||
cv2.rectangle(image_finale, (0, 0), (image_finale.shape[1], 30), couleur_fond, cv2.FILLED)
|
||||
if alarme:
|
||||
cv2.putText(image_finale, "ALARME", (image_finale.shape[1]-80, 20), cv2.FONT_HERSHEY_PLAIN, 1, couleur_alarme, 2)
|
||||
if fichier_video is None:
|
||||
fichier_video=dir_videos+time.strftime("%Y_%m_%d_%H_%M_%S")+".avi"
|
||||
video=cv2.VideoWriter(fichier_video, cv2.VideoWriter_fourcc(*'DIVX'), 15, (largeur, hauteur))
|
||||
video.write(frame)
|
||||
cpt_fin_mouvement=fin_mouvement
|
||||
else:
|
||||
cpt_fin_mouvement=cpt_fin_mouvement-1
|
||||
if fichier_video is not None:
|
||||
if cpt_fin_mouvement==0:
|
||||
video.release()
|
||||
fichier_video=None
|
||||
else:
|
||||
cv2.putText(image_finale, "ALARME", (image_finale.shape[1]-80, 20), cv2.FONT_HERSHEY_PLAIN, 1, couleur_fin_alarme, 2)
|
||||
video.write(frame)
|
||||
txt="[p|m]Nbr pixel: {:d} [o]Mode:{} nbr pixel: {:06d}".format(seuil_nbr_pixel, label_mode[mode], nbr_pixel)
|
||||
tab=np.roll(tab, 1)
|
||||
tab[0]=int(nbr_pixel/300)
|
||||
tab_image=np.full((tab_hauteur, largeur, 3), couleur_fond, dtype=np.float32)
|
||||
ligne_seuil=int(seuil_nbr_pixel/300)
|
||||
for i in range(largeur):
|
||||
couleur=(0, 0, 255) if tab[i]>ligne_seuil else (0, 255, 0)
|
||||
cv2.line(tab_image, (i, tab_hauteur), (i, tab_hauteur-tab[i]), couleur, 1)
|
||||
cv2.line(tab_image, (0, tab_hauteur-ligne_seuil), (largeur, tab_hauteur-ligne_seuil), (0, 0, 255), 1)
|
||||
image_finale[hauteur:, :, :]=tab_image
|
||||
cv2.putText(image_finale, txt, (5, 20), cv2.FONT_HERSHEY_PLAIN, 1, couleur_infos, 2)
|
||||
originale=gray_blur
|
||||
cv2.imshow("Camera", image_finale)
|
||||
cv2.imshow("Mask", mask)
|
||||
key=cv2.waitKey(50)&0xFF
|
||||
if key==ord('q'):
|
||||
break
|
||||
if key==ord('p'):
|
||||
seuil_nbr_pixel+=100
|
||||
if key==ord('m'):
|
||||
seuil_nbr_pixel=max(100, seuil_nbr_pixel-100)
|
||||
if key==ord('o'):
|
||||
mode=not mode
|
||||
|
||||
cap.release()
|
||||
cv2.destroyAllWindows()
|
||||
Reference in New Issue
Block a user