clc
clear all
close all

%% pokus
filename='..\vstup_vid\segmenty.avi';


obj=mmreader(filename);
frames=get(obj,'numberOfFrames');
frames_s=get(obj,'FrameRate');

% aviobj = avifile('output_complet2.avi','fps',frames_s); % nové vieo pro uložení výsledků
 

h=figure;
set(h,'Name','Možné překážky','NumberTitle','off')
axes('position',[0 0 1 1])

tresh_mean=1; % počáteční práh rro stín v případě selhání automatického výpočtu


for frame=21324:1:frames

snimek=read(obj,frame);

tic;
%% uprava vstupniho obrazu
im=imresize((snimek),0.5);
im_orig=im;
im=rgb2gray(im);
im=imfilter(im,fspecial('gaussian',[20 20],1),'same');
im_orig(:,:,1)=imfilter(im_orig(:,:,1),fspecial('gaussian',[20 20],1),'same');
im_orig(:,:,2)=imfilter(im_orig(:,:,2),fspecial('gaussian',[20 20],1),'same');
im_orig(:,:,3)=imfilter(im_orig(:,:,3),fspecial('gaussian',[20 20],1),'same');
im_orig=im_orig(10:end-60,10:end-10,:);
im=im(10:end-60,10:end-10);

im=impyramid(im,'reduce');% redukce velikosti kvůli entropii (čas)

%% entropie

prah=4.4;   %prah po filtr entropie
mask=ones(7,7); %maska pro výpočet okolí entropie


im_entropy = entropyfilt(im,mask);

im_bw=im_entropy>prah; %získáni bin obrazu z entrie
im_bw=~im_bw;
im_bw(end-3:end,:)=0;
im_bw=impyramid(im_bw,'expand'); %obnovení původní velikosti
im_label=bwlabel(im_bw);

x=142;y=154; %výber objektu který je silnice


[maps_srm,images_srm]=srm(double(im_orig),8); %výpočet stat. reg. mer.
index=(im_label(floor(x),floor(y)));
index_srm=(maps_srm{1,1}(floor(x),floor(y))); %index silnice


bw_out_srm=maps_srm{1,1}==index_srm; %% maska silnice
bw_out=im_label==index;              %


im= impyramid(im,'expand');
im_out=im.*uint8(bw_out);
%% stiny

if (index>0)

    [n,xout]=hist(double(reshape(im_out,1,[])),0:1:255); %hystogram pro výpočet prahu stínu
    n(1)=0;                                              %s černou nepočítáme
    [mu,sigma] = normfit(xout,[],[],n); %výpočrt parametru norm rozlození
    Y=40*max(n).*normpdf(xout,mu,sigma);


    tresh=mu-3*sigma;                 %prah stinu
    tresh_mean=(tresh+tresh_mean)/2;  %pro pripad selhani pocitame prumer minulych
else
    tresh= tresh_mean;                 
end
    
im_sh=im<tresh; %maska stinu
im_sh=imfilter(double(im_sh),ones(1,9),'same'); %rozsiřeni stinu, spojí blízké

[m,n]= size(im_sh);


mask_srm=maps_srm{1,1}(x,y);                 %   maskovani stinu prez silnici
mask_srm=maps_srm{1,1}==mask_srm;
im_sh=im_sh.*mask_srm;

im_sh_mask=zeros(m,n);

for nn=1:n
    
        ind=find(im_sh(:,nn),1,'last');
        im_sh_mask(1:ind,nn)=1;

end
im_entropy_shadow=(~im_bw).*im_sh_mask;


%% loc nahraa za hranovy detektor , původne mělo sloužit i pro nauceni UNN

k=[0 1 0;
   2 0 4;
   0 8 0];

%  t=best_t(im_orig)

t=[0 10 0;
   10 0 10;
   0 10 0];

im_loc=Matlab_cpp(double(im_orig),k,t);% pokud nefunguje použít: imloc(double(im_orig),k,t)
im_loc=reshape(im_loc,[m,n,3]);

im_loc_bw=(im_loc(:,:,1)+im_loc(:,:,2)+im_loc(:,:,3))>0;


%% kompletace

[m,n]=size(im);


mask = ones(21,21);
im_conv1=imfilter(double(im_loc_bw),mask,'same');
im_fusion=im_conv1>max(max(im_conv1))/2;

prekazky_label=bwlabel(im_entropy_shadow.*im_fusion);



STATS = regionprops(prekazky_label, 'BoundingBox'); %kvuli vyznaceni regionu s prekazkami (obdelnik)
[m,n]=size(STATS);

time=toc;

%% zobrazeni

im_e=impyramid(im_entropy,'expand');

figure(h)
hold off,
transparent = imlincomb(1, uint8(images_srm{1,1}), 0.5, im_orig);
imshow(transparent)
hold on
for mm=1:m
    if(bw_out_srm(ceil(STATS(mm,1).BoundingBox(2)),ceil(STATS(mm,1).BoundingBox(1))))
rectangle('Position',STATS(mm,1).BoundingBox,'LineWidth',2,'EdgeColor','red')
    else
rectangle('Position',STATS(mm,1).BoundingBox,'LineWidth',2,'EdgeColor','green')

    end
end

text(10,150,['frame: ',num2str(frame), '/',num2str(frames) ],'Color','green')
text(10,165,[num2str(1/time), ' frame/s'],'Color','green')

% out_snimek = getframe(h); %snímek z figure
% aviobj = addframe(aviobj,out_snimek); %uložení do výstupního videa
end
% aviobj = close(aviobj);   %zavreni souboru videa

