%Programa: SubstraccionFondo_BG_promedio
%Descripción: Substracción de fondo utilizando como actualización del BG el
%promedio de N frames
%Autor: FJHL
%Fecha inicial: 25/Sept/2015
%Fecha actualización: 30/Sept/2015, Evaluación del error con respecto al
%Ground Truth (GT)

clear all;
close all;
clc;

%Leer video original
video=VideoReader('../videos/highway_460to869.avi');

%Leer el GT
video_GT=VideoReader('../videos/highway_GT_460to869.avi');


%Crear el modelo del BG
%Vamos a tomar el promedio de los N primeros frames
N=10;
BG_promedio=Calcular_BG_promedio(video,1,N);

%Desplegar el modelo del BG promedio
figure(1);
imagesc(BG_promedio);
colormap gray;

%Parámetros
theta=0.02;%Umbral

%Variables para la evaluzación del error
TP_acum=0; %Acumulador de True Positives
TN_acum=0; %Acumulador de True Negatives
FP_acum=0; %Acumulador de False Positives
FN_acum=0; %Acumulador de False Negatives

frame_GT_RGB=read(video_GT,1);

[h_gt,w_gt,nc_gt]=size(frame_GT_RGB);
ban_rgb_gt=0;
if(nc_gt==3)
    ban_rgb_gt=1;
end


%Leer los siguientes frames del video
for i=N+1:video.NumberOfFrames
    frame_RGB=read(video,i);%escala RGB
    frame_Gray=double(rgb2gray(frame_RGB));%en escala grises y double
   
    %Substracción del fondo entre el frame actual y el BG_promedio
    r=frame_Gray-BG_promedio;
    
    %Substracción simple: Aplicamos un umbral a r^2
    rr=r.*r;
    rr_norm=normalizar(rr,0,1);
    b=rr_norm>theta;
    
    %Actualización del modelo del BG
    %BG_promedio=Calcular_BG_promedio(video,1,i);
    BG_promedio=Calcular_BG_promedio(video,i-N+1,i);
    
    %Evaluación del error
    frame_GT_RGB=read(video_GT,i);%escala RGB
    if(ban_rgb_gt==1)
        frame_GT_Gray=rgb2gray(frame_GT_RGB);%en escala grises
    else
        frame_GT_Gray=frame_GT_RGB;%ya estaba en escala de grises
    end
    
    TP=sum(sum((b==1)&(frame_GT_Gray==255)));%True Positives
    TP_acum=TP_acum+TP;
    
    TN=sum(sum((b==0)&(frame_GT_Gray==0)));%True Negatives
    TN_acum=TN_acum+TN;
    
    FP=sum(sum((b==1)&(frame_GT_Gray==0)));%False Positives
    FP_acum=FP_acum+FP;
    
    FN=sum(sum((b==0)&(frame_GT_Gray==255)));%False Negatives
    FN_acum=FN_acum+FN;
    
    figure(2);
    imagesc(frame_Gray);
    colormap gray;
    
    figure(3);
    imagesc(b);
    colormap gray;

    figure(4);
    imagesc(BG_promedio);
    colormap gray;
    
    pause(0.03);
end

PDR=TP_acum/(TP_acum+FN_acum)
NDR=TN_acum/(TN_acum+FP_acum)
P=TP_acum/(TP_acum+FP_acum)
F=(2*PDR*P)/(PDR+P)



% for i=1:video.NumberOfFrames
%     frame=read(video,i);
%     image(frame);
%     pause(0.001);
% end







