%----------------------------------------------------
% >>>Sistemi Avanzati per il Riconoscimento<<<
%    15 dicembre 2016
%    - Shape Descriptors - Traccia
%---------------------------------------------------- 

clear all;
close all;
%----------------------------------------
% FUNZIONE DI BASE SPLINE QUADRATICA
%----------------------------------------
s=[0:0.01:3]';
Qx = [2]
B_0= qb_spline(s);
x_s = B_0.*Qx;
figure(1); set(gcf,'name','Funzione di base spline quadratica');
plot(s,x_s)
hold on;
scatter(3/2,Qx,50,[1,0,0],'marker','O','markerfacecolor',[1,0,0])


%----------------------------------------
% BASE COMPOSTA DA 4 FUNZIONI DI BASE 
%----------------------------------------
NB=4;
s=[0:0.01:3+NB-1]';
Qx = [1,5,3,5]';
x_s = zeros(length(s),1);
for n=0:NB-1
    x_s = x_s + qb_spline(s-n).*Qx(n+1);
end
figure(2); set(gcf,'name','B-spline quadratica, 4 funzioni base');
plot(s,x_s); hold on;
scatter(1/2+[1:NB],Qx,50,[1,0,0],'marker','O','markerfacecolor',[1,0,0])

%% -- ESAMINO I CONTRIBUTI DELLE SINGOLE FUNZIONI BASE -- %%
x_s_mul = zeros(length(s),NB);
for n=0:NB-1
    x_s_mul(:,n+1) = x_s_mul(:,n+1) + qb_spline(s-n).*Qx(n+1);
    plot(s,x_s_mul(:,n+1),'color',unifrnd(0,1,1,3)); 
end
% Nota che non si riescono a controllare i valori iniziali della curva.  


%--------------------------------------
% BASE COMPOSTA DA 5 FUNZIONI DI BASE
%--------------------------------------
%% Curva parametrica r(s) su x e y;
Qx= [0 1 3 2 1]; % nodi in x;
Qy= [2 0 2 2 5]; % nodi in y;
nB = length(Qx);
L = nB;
xs = zeros(nB*100+1,1);
ys = zeros(nB*100+1,1);
s=[0:0.01:nB];
    for n=1:nB
        fprintf('itero\n')
        mod(s-n,nB)
    xs= xs+Qx(n).*qb_spline(mod(s-n,nB));
    ys= ys+Qy(n).*qb_spline(mod(s-n,nB));
    end

figure(3); set(gcf,'name','Curva 2D chiusa')
scatter(xs,ys); hold on
scatter(Qx,Qy,50,[1,0,0],'marker','O','markerfacecolor',[1,0,0])

%ESERCIZIO: istanziare un ciclo su un punto 2D facendolo cambiare e
%osservando come varia la curva spline corrispondente. Il punto 2D puo' 
% essere fatto variare a piacere (su un cerchio, una spezzata etc.)

%% Curva parametrica r(s) su x e y;
x = [0:0.1:2*pi];
varx =sin(x);
y = [0:0.1:2*pi];
vary =2+cos(y)/2;
for xx = varx
    for yy = vary
        
        Qx= [0 1 3 xx 0]; % nodi in x;
        Qy= [0 0 2 yy 1]; % nodi in y;
        nB = length(Qx);
        L = nB;
        
        xs = zeros(nB*100+1,1);
        ys = zeros(nB*100+1,1);
        
        s=[0:0.01:nB];
        for n=1:nB
            xs= xs+Qx(n).*qb_spline(mod(s-n,nB));
            ys= ys+Qy(n).*qb_spline(mod(s-n,nB));
        end
        figure(4); set(gcf,'name','Curva 2D chiusa')
        scatter(xs,ys); hold on
        scatter(Qx,Qy,50,[1,0,0],'marker','O','markerfacecolor',[1,0,0])
        axis([-2 3 0 2.5])
        hold off;
        drawnow;
        pause(0.001)
    end
end

%%%%%%%%%%%%%%%%% Analisi di forme in video sequenze
here = pwd
addpath(here);

input = '.\PRE\';
output = '.\RES\';
fprintf('-BG subtraction-\n');
SGimages(input,...
    output,...
    3,0.00001,0.99,0.001,14,12,18);
close all;
% ESERCIZIO 2: aumentare/diminuire la bonta' di approssimazione della spline

% ESERCIZIO 3: segmentazione; l'obiettivo e' di individuare nel filmato
% l'esistenza di due differenti azioni, ossia camminare e telefonare. Una
% possibile pipeline e' quella di normalizzare il sistema di coordinate che
% definisce il contorno della silhouette rispetto al centroide della
% stessa. Di seguito, si potrebbe applicare PCA per ridurre la
% dimensionalita' dei pattern che rappresentano i contorni e poterli quindi
% visualizzare. Se la visualizzazione evidenzia due gruppi di punti
% differenti, e' sperabile che questi rappresentino esattamente le due
% azioni. Applicando clustering ai pattern ridotti in dimensionalita' s e
% back-proiettando le etichette del clustering sui frame iniziali si
% risolve l'esercizio (ma non e' detto che sia la soluzione piu' efficace, 
% pensate eventualmente alla vostra personale)