base = imread('empty.JPG','jpg'); % Read the image taken while the place is empty
% Esse imagem vai ser usada como base. Ela seria tirada quando não tem
% ninguem no ambiente para ser usada posteriormente para comparar com as
% imagens da webcam
base_d = im2double(base); % cast it from uint8 to double, rescaling from 0 to 1
% Essa linha transforma de os dados da imagem (que vem em inteiros de 8
% bits (0 a 256)) em double e tambem ajusta a escala entre 0 e 1.
figure(1);imshow(base); % show the image to the user
title('Sala Vazia'); 
% Mostra a imagem

current = imread('with_someone.JPG','jpg'); % Read the current image from the "webcam"
% Essa imagem é carregada simulando um frame da webcam
current_d = im2double(current); % cast it from uint8 to double, rescaling from 0 to 1
% Aqui tambem transforma em double pra poder fazer calculos depois
figure(2);imshow(current);% show the image to the user
title('Sala com Intrusos');

diff = abs(current_d-base_d);

% Faz a diferença numérica entra as imagens ( subtrai pixel por pixel) para
% ser usado depois
motion_threshold = 20000;
light_threshold = 0.1;
% Esse numero podem ser definidos pelo usuário e são limiares para se
% adaptar as condições do local
% light_threshold = limiar da iluminação : Todos os valores de pixels que
% estiverem diferença a cima desse valor tiveram mudança maior do que
% somente uma variação de iluminação e portanto são considerados que alguma
% coisa se moveu (lembrando que agora os pixels agora tem valores entre 0 e
% 1)
% motion_threshold = limiar de movimentação: Se a quantidade de pixels for
% maior que esse limiar, alguma coisa grande se moveu e um alerta deve ser
% emitido
diff_elements = diff > light_threshold; % Create a matrix of booleans containing
% which elements had too much difference ( more than the light change)
% Conta quantos canais de cores tiveram mudança acima do limiar de
% iluminação
diff_pixels = diff_elements(:,:,1) .*  diff_elements(:,:,2) .* diff_elements(:,:,3) ;

% Esse multiplicação é igual um AND, e resulta numa matriz booleana que
% guarda quais pixels tinham diferença
diff_pixel_count = sum(sum(diff_pixels)); % Count the pixels that are 
% too different
% Conta quantos pixels estavam diferentes
time = clock; % Pega a hora do dia. Clock retorna um vetor [ano mes dia hora minuto segundo]
week_day = weekday(datetime('today')); % pega o dia da semana ( 1 é domingo, 7 é sabado)

is_weekend = week_day == 1 || week_day == 7; % Checa se é dia da semana
is_work_hours = (time(4) >=8 && time(4) <= 17); % Checa se é horario de trabalho

%%Configuração do email - Precisa ser feita somente uma vez mas não tem problema se fizer mais (Preencha as variaveis)
% Tem que ser email do gmail e também tem que acessar:
% https://www.google.com/settings/security/lesssecureapps 
% pra habilitar o envio de emails
%email ='jeneffer.f@gmail.com'
%senha = 
%setpref('Internet','SMTP_Username',email);
%setpref('Internet','SMTP_Password',senha);
%props = java.lang.System.getProperties;
%props.setProperty('mail.smtp.auth','true');
%props.setProperty('mail.smtp.socketFactory.class', 'javax.net.ssl.SSLSocketFactory');
%props.setProperty('mail.smtp.socketFactory.port','465');
if diff_pixel_count > motion_threshold % if we had motion, check the date
    % Se a quantidade de pixels diferentes é maior que o limiar, temos um
    % intruso
    if is_weekend || is_work_hours % if it's not work time, we have an intrusor
        % Checa se não é horario de trabalho, se for, não emite alarme.
        % Substitua o seu email abaixo que será o destinatário.
        disp('We have an intrusor, sending email');
        sendmail('jeneffer.f@aluno.ifsc.edu.br','Motion detected',' We detected an intrusor with your webcam','with_someone.JPG.jpg');
    end
end
       
figure(3); imshow(diff);
title('Diferença das Imagens');
figure(4); imshow(diff_pixels);
title ('Diferença de pixels que variaram de uma imagem para outra');
