%----------------------------------------------%
% Vypracoval : Pavel Konecny a Martin Simunek  % 
%    PVI - skladani obrazu                     %
%----------------------------------------------%


%------------- CORRGUI, LOAD_CORR --------------%
%  Corrgui je program matlabu, kde rucne        % 
%  oznacim v obrazcich korenspondujici se body. %
%  Souradnice techto bodu jsou zaznamenany      % 	
%  a daji se ulozit. Poslouzi k nacteni funkci  %
%	load_corr a ulozeni do matice ve tvaru:      % 
%[  u'   u1'                          un'    ]  & 
%[  v'   v1'                          vn'    ]  &
%[  u''  u1''                         un''   ]  & 
%[  v''  v1''                         vn''   ]  %	
%                                               %
% Pro n-oznacenych korenspondujicich bodu       %
%-----------------------------------------------%

%  corrgui; 

close all;
clear all;
M=load_corr('DVAPIC');
M=M(:,2:end);

n=size (M,2);


%---------------------------------------------%
%A=(u' v' 1  0  0  0  -u''u'  -u''v'  -u'')   %
%  (0  0  0  u' v' 1  -v''u'  -v''v'  -v'')   %
%  (....                                  )   %
%---------------------------------------------%

for i=1:n
   A(2*i-1,1)=M(1,i);
   A(2*i-1,2)=M(2,i);
   A(2*i-1,3)=1;
   A(2*i-1,4)=0;
   A(2*i-1,5)=0;
   A(2*i-1,6)=0;
   A(2*i-1,7)=-M(3,i)*M(1,i);
   A(2*i-1,8)=-M(3,i)*M(2,i);
   A(2*i-1,9)=-M(3,i);

   A(2*i,1)=0;
   A(2*i,2)=0;
   A(2*i,3)=0;
   A(2*i,4)=M(1,i);
   A(2*i,5)=M(2,i);
   A(2*i,6)=1;
   A(2*i,7)=-M(4,i)*M(1,i);
   A(2*i,8)=-M(4,i)*M(2,i);
   A(2*i,9)=-M(4,i);
 
end;


%--------------------------------%	
% A*h=0                          %
%                                %
% H=(h1 h2 h3)                   %
%   (h4 h5 h6)                   %
%   (h7 h8 h9)                   %
%--------------------------------%

[U,S,V] = svd(A);
for i=1:1:size(V,1)
   if S(i,i)<(10*eps) 
      Reseni2=V(:,i);
      A*Reseni2;
    end
end


%------------------------------------%	
% h je poslednim sloupkem matice V   %
% a prikazem reshape se prevede do   %
% tvaru matice H'                    %
%------------------------------------%	

h=V(:,9);
H=reshape(h,3,3)';


A=imread('panorama1.jpg');  % nacteni obrazku
size(A);                % jeho rozmìry (v pixelech)
A=double(A);  
A=A(5:size(A,1)-5,5:size(A,2)-5,:);

B=imread('panorama2.jpg');  % nacteni obrazku
size(B);                % jeho rozmìry (v pixelech)
B=double(B);  
B=B(5:size(B,1)-5,5:size(B,2)-5,:);


% Vytvoreni noveho obrazku
C= zeros(2*size(A,1),2*size(A,2));

% Zkopirovani praveho obrazku
rozmer = [ (size(C,1)-size(B,1))/2,size(C,2)-size(B,2) ];
% zdvojnasobeni velikosti rozmeru obrazku
rozmer=round(rozmer);
C(rozmer(1):rozmer(1)+size(B,1)-1, rozmer(2):rozmer(2)+size(B,2)-1)=B(:,:,2);
  % nakopiruji pravy obrazek do prave pulky a ctvrtiny ze zhora 



%----------------------------%
%   ALG zobrazeni druheho    %
%            obrazku         %
%----------------------------%

Hinv = inv(H);

roh1=H*[1,1,1]';
roh2=H*[1,size(B,1),1]';
roh3=H*[size(B,2),size(B,1),1]';
roh4=H*[size(B,2),1,1]';

roh1=roh1./roh1(3);
roh2=roh2./roh2(3);
roh3=roh3./roh3(3);
roh4=roh4./roh4(3);

pomocna=zeros(roh4(1)-roh1(1),roh3(2)-roh4(2));


for i=(roh1(1)+15):roh4(1)
   for j=roh4(2):roh3(2)
                pomocna=Hinv*[i;j;1];
      pomx = round(pomocna(1)/pomocna(3));
      pomy = round(pomocna(2)/pomocna(3));
      if (pomx<=size(B,2) & pomx>=1 & pomy>=1 & pomy<=size(B,1))
         C(round(j)+rozmer(1),round(i)+rozmer(2))=A(pomy, pomx,2);
      end
   end
end


figure(1); % imagesc(C);
imshow(C./255);
title('Spojeny obrazek');
axis equal        % srovnani do rasrtru se stejnymi jednotkami na osach
hold on;



