Files
cours-ai-tutorials/OpenCV/tutoriel26/camera.py
2026-03-31 13:28:59 +02:00

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()