% % % % % contoure_track
% Tento program je součástí diplomové práce práce:
% Metody pro zpracování termovizních snímků s detekcí stanovené oblasti obličeje
% Autor: Dana Kolářová
% ID: 124347
% Škola: VUT Brno
% Fakulta: FEKT
% Obor: Biomedicínské inženýrství a bioinformatika
%************************************************
% Aplikace je spustitelná v prostředi Matlab.
% Použitá verze : Matlab 7.9.0 (R2009b)
% Tato funkce slouží k doplnění chybejících částí zpět do oblasti zájmu.
% [x1,y1,help_i,k]=contoure_track(test,kontura,body,img)
% 
% vstupy:
% test - segmentovaný snímek
% kontura - kontura dosavadní segmentace
% body - body pro počáteční trackování 
% img - svrchní shluk

function [x1,y1,help_i,k]=contoure_track(test,kontura,body,img)
%%
top=min(kontura(:,1));          % nalezení nejnižšího bodu na vertikální ose, představuje vrchol hlavy
help_i=ceil(im2double(rgb2gray(test))); % převod na binární obraz

 for p=1:length(kontura(:,1))
     help_i(kontura(p,1),kontura(p,2))=1; % vykreslení pixelů
 end
 %% nalezeni nejužší části ve spodní polonině - misto odkud začnu
 B = bwtraceboundary(help_i,[body(1),body(2)],'W',8);
 B=sortrows(B,2);               % seřazení bodů podle vertikální osy
 wide=inf;                      % nastavení na nekonečno
 [nrows,ncols]=size(help_i);    % prednastavení širky

for h=0.6*nrows:0.9*nrows % omezení prostoru
    row=find(h==B(:,1));  % nalezení všech pixelů v jedné řadě
    if length(row)>=2   
        if B(row(end),2)-B(row(1),2)<wide % pokud je vetši než dosavadni šířka uloží se souřadnice
            wide=B(row(end),2)-B(row(1),2);
            xy=[h,B(row(1),2),B(row(end),2)]; % jen x,  nepotřebuju
        end
    row=[];
    end
end
body=xy;    %uložení bodů
 %%
 help_i(:,round(ncols/2))=0; % mezera aby se mohli povyplnovat vnitřní části
 k=zeros(nrows,ncols);      % přednastavení snímku pro vykrslování

help_i2=1-help_i;
L=bwlabel(help_i2,4); % označení bílých segmentů
STATS = regionprops(L,'Area'); % výpočet plochy segmentů
[~,m]=max([STATS(:,1).Area]); % nalezení největší ploch
[x,y]=find(L~=m); % nalezení indexů malých ploch
for p=1:length(x)  % vyplnění nalezených pixelů
    kontura(x(p),y(p))=1;
end
b2=body(1);
b1=body(2);
contoure=[body(1),body(2)];
while b2<=nrows && b1<ncols && b2>0 && b1>0
    if kontura(b2-1,b1)==1 % naroru
        kontura(b2,b1)=0;
        b2=b2-1;
    else if kontura(b2-1,b1+1)==1 % nahore vpravo
            kontura(b2,b1)=0;
            b2=b2-1;
            b1=b1+1;
        else if kontura(b2-1,b1-1)==1 %vlevo nahore
                kontura(b2,b1)=0;
                b1=b1-1;
                b2=b2-1;
            else if kontura(b2+1,b1+1)==1 % vpravo dole
                    kontura(b2,b1)=0;
                    b1=b1+1;
                    b2=b2+1;
                else if kontura(b2+1,b1)==1 % dole
                        kontura(b2,b1)=0;
                        b2=b2+1;
                    else if kontura(b2+1,b1-1)==1 %vlevo dole
                            kontura(b2,b1)=0;
                            b1=b1-1;
                            b2=b2+1;
                        else if kontura(b2,b1-1)==1 % vlavo
                                kontura(b2,b1)=0;
                                b1=b1-1;
                            else if  kontura(b2,b1+1)==1 % vpravo
                                    kontura(b2,b1)=0;
                                    b1=b1+1;
                                else break;
                                end
                            end
                        end
                    end
                end
            end
        end
    end
       contoure=[contoure;[b2,b1]];

end
B=contoure;
for p=1:length(B(:,1))
    k(B(p,1),B(p,2))=1; % vyplnění chybějícíhc částí
end


[linka1x,i]=min(contoure(:,1));
linka1y=contoure(i,2);

b1=body(3);
b2=body(1);
contoure=[b2,b1];

%% druhá strana
pozice=[];
while b2<=nrows && b1<ncols && b2>0 && b1>0
    if kontura(b2-1,b1)==1 % naroru
        pozice=[pozice,[b2,b1]];
        kontura(b2,b1)=0;
        b2=b2-1;
    else if kontura(b2-1,b1-1)==1 %vlevo nahore
            kontura(b2,b1)=0;
            b1=b1-1;
            b2=b2-1;
        else if kontura(b2-1,b1+1)==1 % nahore vpravo
                kontura(b2,b1)=0;
                b2=b2-1;
                b1=b1+1;                               
            else if kontura(b2+1,b1-1)==1 %vlevo dole
                    kontura(b2,b1)=0;
                    b1=b1-1;
                    b2=b2+1;
                else if kontura(b2+1,b1)==1 % dole
                        kontura(b2,b1)=0;
                        b2=b2+1;
                    else if kontura(b2+1,b1+1)==1 % vpravo dole
                            kontura(b2,b1)=0;
                            b1=b1+1;
                            b2=b2+1;
                        else if  kontura(b2,b1+1)==1 % vpravo
                                kontura(b2,b1)=0;
                                b1=b1+1;
                            else if kontura(b2,b1-1)==1 % vlavo
                                    kontura(b2,b1)=0;
                                    b1=b1-1;
                                else break;
                                end
                            end
                        end
                    end
                end
            end
        end
    end
     contoure=[contoure;[b2,b1]];

end

B=contoure;
[linka2x,i]=min(contoure(:,1));
linka2y=contoure(i,2);

for p=1:length(B(:,1))
    k(B(p,1),B(p,2))=1; % vyplnění chybějícíhc částí
end

vektor=sort([linka1x,linka2x]);
if abs(linka1x-linka2x)<nrows/5 && (linka1x >1.2*top|| linka2x>1.2*top) 
    if vektor(1)<top
help_i(1:vektor(2)-1,:)=0;
linka=vektor(1);
    else help_i(1:vektor(1)-1,:)=0;
        linka=vektor(1);
    end
elseif vektor(1) <top && vektor(2)>top
    help_i(1:vektor(2)-1,:)=0;
    linka=vektor(2);
else linka=max(vektor);
end

 if (linka1x <1.3*top) && (linka2x<1.3*top) % pokud skončilo sledování moc vysoko tak se nezařadí žádna oblast
        help_i(:,:)=0;

 else
 a1=abs(find(help_i(linka1x,:), 1 )-find(img(linka1x-1,:),1));
 a2=abs(find(help_i(body(1),:), 1 )-find(img(body(1)-1,:),1));
 a3=abs(find(help_i(linka2x,:), 1 )-find(img(linka2x-1,:),1));
 a4=abs(max(find(help_i(body(1),:)))-max(find(img(body(1)-1,:))));
if isempty(a1)
    a1=abs(find(help_i(linka,:), 1 )-find(img(linka-1,:),1));
elseif isempty(a3)
    a3=abs(find(help_i(linka,:), 1 )-find(img(linka-1,:),1));
end
 if (a1>3 && a2>3)||(a3>3 && a4>3)
     for i=linka:body(1)

         help_i(i,1:find(help_i(i,:), 1 )+0.8*max([a1,a2]))=0;
           help_i(i,max(find(help_i(i,:)))-0.8*max([a3,a4]):end)=0;
     end
 elseif (a1>3 && a2<3)||(a3>3 && a4<3)
     for i=linka-1:-1:linka-2*max([a1,a3])
          help_i(i,find(help_i(linka,:),1)+1*(linka-i):ncols/2)=1;
          help_i(i,ncols/2:max(find(help_i(linka,1:3*ncols/4)))+1*(i-linka))=1;
     end

 end

 
  help_i(body(1):end,:)=0;
 end
[x1,y1]=find(help_i==1); % nalezení souradnic

