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