% % % % % time_delay
% 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 výpočtu teplot ze surových dat získaných z
% termosnímků.Také umožňuje získat informace o nastavení parametrů
% tarmokamery behem snímání snímků.
% Funkce je volána ve tvaru
% [time,FileName1,TEPLOTA,Data]=time_delay(FileName,Newpath1,N)
% 
% vstupy:
% FileName -  názvy zpracovávaných snímků
% Newpath - cesta ke snímkům
% N - počet snímků
%
% výstupy: 
% time - matice s časovými údaji jednotlivých snímků
% FileName1 - matice s uloženými teplotami jednotlivých pixelů v originálních snímcích
% Data -  matice s teplotními konstatami, emisivitou a dalším nastavením
% termokamery
function [time,FileName1,TEPLOTA,Data]=time_delay(FileName,Newpath1,N)

time=[1:N]'; % vytvoření matice pro uložení časových údajů
TEPLOTA=cell(1,N); % vytvoření buňky pro uložení vyypočtených teplot

for i=1:N
    [~ ,info]=system(['exiftool -s "',Newpath1,FileName{1,i},'"']); % získání informace o zpracovávaném snímku
    word='Original';
    k= strfind(info,word); % nalezení pozice hledaného slova
    waitbar((N+i)/(2*N));
    h=str2double(info(k+37:k+37+1)); % vypočtení hodiny pořízení snímku
    m=str2double(info(k+40:k+40+1)); % vypočtení minuty pořízení snímku
    s=str2double(info(k+43:k+43+1)); % vypočtení sekundy pořízení snímku
    time(i,2)=h*60*60+m*60+s;        % výsledný čas
 
    if i==1 % čtení dalších informací ze snímku potřebných pro vypočtení teploty :
        word=[];
        word=char(word);
        Data=cell(2,7);
        Data{1,1}='Emissivity';
        Data{1,2}='ReflectedApparentTemperature';
        Data{1,3}='PlanckR1';
        Data{1,4}='PlanckB';
        Data{1,5}='PlanckF';
        Data{1,6}='PlanckR2';
        Data{1,7}='PlanckO';
        Data{1,8}='SubjectDistance';
        Data{1,9}='AtmosphericTemperature';
        Data{1,10}='RelativeHumidity';
        Data{1,11}='AtmosphericTransAlpha1';
        Data{1,12}='AtmosphericTransAlpha2';
        Data{1,13}='AtmosphericTransBeta1';
        Data{1,14}='AtmosphericTransBeta2';
        Data{1,15}='AtmosphericTransX';
 
        for o=1:length(Data(1,:)) % vyhledávání jednotlivých klíčových slov
            k(o)= strfind(info,Data{1,o}); % nalezení indexu počátku hledaného slova
            j=1;
            while double(info(k(o)+33+j))~=10 && double(info(k(o)+33+j))~=32 % dokud není konec řádku či mezera
                word(end+1)=info(k(o)+33+j); % přečtení znaku na pozici
                j=j+1;                       % inkrementace pozice
            end
            Data{2,o}=str2double(word);      % převedení na číslo
            word=[];                         % vymazání pomocné promněné
            word=char(word);                 % datový typ char
        end
        emis=Data{2,1};                      % uložení čísel ke konstantám
        B=Data{2,4};
        R1=Data{2,3};
        R2=Data{2,6};
        O=Data{2,7};
        T_REF=Data{2,2}+273.15;
        F=Data{2,5};
        Distance= Data{2,8};
        Air_Temp=Data{2,9}+273.15;
        humidity=Data{2,10}/100; % prevedeni z procent
        Alpha1=Data{2,11};
        Alpha2=Data{2,12};
        Beta1=Data{2,13};
        Beta2=Data{2,14};
        X_c=Data{2,15};
        % výpočet teploty podle vzorců uvedených v kapitole 7
        h2o=humidity * exp(1.5587 + 0.06939 * (Air_Temp-273.15) - 0.00027816 * (Air_Temp-273.15)^2 + 0.00000068455 *(Air_Temp-273.15)^3);
        tau=X_c * exp(-sqrt(Distance) * (Alpha1 + Beta1 * sqrt(h2o))) + (1-X_c) * exp(-sqrt(Distance) * (Alpha2 + Beta2 * sqrt(h2o)));
        RAW_Atm=(R1/(R2*(exp(B/(Air_Temp))-F))-O)*(1-tau);
        RAW_refl=(R1/(R2*(exp(B/(T_REF))-F))-O)*(1-emis)*tau;

        for ind=1:N % pro jednotlivé snímky ze surových dat
            t=[];
            name=FileName{1,ind};
            
            img=imread([name(1:end-3),'tif']); % načtení konkrétního snímku
            [m,n]=size(img);
            img=double(img);
            
            for I=1:m
                for J=1:n
                    RAW_obj=(img(I,J)-RAW_Atm-RAW_refl)/emis/tau;
                    T(I,J)=B/log(R1/(R2*(RAW_obj+O))+F);
                end
            end
            t=T-273.15;
            t=imresize(t,[240,320],'bicubic'); % interpolace do půvoní velikosti snímku
            TEPLOTA{1,ind}=t; % uložení teplot ve °C do matice
        end
    end
end

time=[sortrows(time,2)]'; % seřazení času jednotlivých snímků podle času od sejmutí
c=time(2,1); % nalezení prvního snímku a vypočet šasu uplynulého od prvníhu snímku
time(2,:)=time(2,:)-c;
FileName1=cell(1,N);
for i=1:N
    FileName1{1,i}=FileName{1,time(1,i)}; % seřazení snímků
end



