%function detector_humo
close all
clear all

imagen_video=aviread('humo_chico.avi'); %Leo el video



A=get (imagen_video); 
frames=A.NumberOfFrames;
tiempohumo=5;
area3=0;
areas=zeros(1,frames);
areas2=zeros(1,frames);
i=1;
f=1;
    
    while(i<=frames-20)   
     tic;
        imagencolor=read(imagen_video,20);
        
        imagencolor2=read(imagen_video,i+20);

        imagen_double = im2double(imagencolor);
        imagen_double2 = im2double(imagencolor2);
      
        imagen_resta=imagen_double2-imagen_double;
      
        imagen_resta_gray =rgb2gray(imagen_resta);
        
        %Coge una imagen del video y la siguiente, las pasa a double
        %y resta la segunda con la primera
        %La solución la pasa a una imagen a escala de grises
      
        level =	graythresh(imagen_resta); %calcula un umbral global (LEVEL) 

        bw=im2bw(imagen_resta,level); %convertir la imagen en una imagen binaria
       
        se = strel('disk',4);   %crea un plano en forma de disco de radio 4
        
      %realizamos la función open: priemro un erode y luego un dilate de la misma imagen
      
        erodedBW = imerode(bw,se); %erosiona la imagen en escala de grises, binaria (bw)
        %siende se el elemento estructurante devuelto por la función strel
   
        
        bw_fin = imdilate(erodedBW,se); %dilata la imagen resultante de la erosión

        a=imhist(imagen_resta_gray); %muestra el histograma de la imagen
   
     
         b=a(1:80);

         t=min(b);


         [L,num] = bwlabel(bw_fin); % devuelve una matriz L del mismo tamaño que bw_fin
         %  que contiene las etiquetas de los componentes 8 conectados en
         %  bw_fin
         
         s  = regionprops(L,'all'); %retorna todos los medidores de forma
         bw3= ismember(L, find([s.Area] >= 80)); 
         %devuelve una matriz del mismo tamaño que L
         %que contiene 1, donde los elementos de L estan en el area especificada y 0 en caso contrario.
   


      if t>0.01*255
          figure(1),imshow(imagencolor2)
               hold on
             c=imcontour(bw_fin,1,'b'); % dibuja un gráfico de contorno de la imagen
          
             for j=1:num
                    areaaux(j)=s(j).Area;
                    
             end
             area=sum(areaaux);
             area2=area;
             x=0;
             n=0;
             while ((area*10>=area2) && (n~=1));

                bw3 = imdilate(bw3,se);

                [K,n] = bwlabel(bw3);
                s2  = regionprops(K,'all');
                for j=1:n
                    areaaux(j)=s2(j).Area;
                end
                area2=sum(areaaux);
                
                x=x+1;
             end
         
             
             for k=1:x
                bw3 = imerode(bw3,se);
             end

             [K3,n3] = bwlabel(bw3);
             s3  = regionprops(K3,'all');
             
             for j=1:n3
                area3(j)=s3(j).Area;
             end
            
             areas(f)=sum(area3);
             
           
         else
        
          
      end
     if f>tiempohumo+1
      k=0;
        if areas(f)>1000
          k(i)= areas(f)-areas(f-tiempohumo);
          if k(i)>100
              i;
              figure(1),imshow(imagencolor2)
               hold on
             c=imcontour(bw_fin,3,'r');
              disp 'hay humo'
              areas2(f)=areas(f);
          else
              figure(1),imshow(imagencolor2)
               hold on
             c=imcontour(bw_fin,2,'g');
          end
        end
     end
      
      tiempo(f)=toc;
      
      i=i+round((A.NumberOfFrames/A.Duration).*tiempo(f));
      f=f+1;
    end
    
    areas=areas(1:f);
    areas2=areas2(1:f);
            
    figure
    hold on
    plot (areas,'b');
    plot (find(areas2>0),areas2(find(areas2>0)),'r');
    hold off
   
    
    title('Evolución de las Areas')
    ylabel('Area del humo')
    xlabel('frames')
   


 

 



