109 lines
3.9 KiB
Python
109 lines
3.9 KiB
Python
|
|
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()
|