📄 funmatinmmdpel.m
字号:
%funmatinmmdpel Iterative Nonlinear Method Minimizing Distances of Points to Epipolar Lines
% [F] = funmatinmmdpel(M,Fini,n)
%
% M matriu de 4-per-n amb les coordendes de n punts en dues imatges
% on n 閟 mes gran o igual que 8
% primera fila: coordenada x de la primera imatge
% segona fila: coordenada y de la primera imatge
% tercera fila: coordenada x de la segona imatge
% quarta fila: coordenada y de la segona imatge
% Fini Matriu fonamental inicial
% n numero de iteraci髇s maxima
%
% F matriu fonamental de 3-per-3 amb l'origen de coordenades del m髇 a la segona camera
%
% by X. Armangue
% (c) Mr3D - University of Girona, September 2002
%
function [F]=funmatinmmdpel(M,Fini,n)
if (size(M,1)~=4) | (size(M,2)<8),
disp('Error: parametres incorrectes')
else
indexs=[1 2 3; 1 3 2; 2 1 3; 2 3 1; 3 1 2; 3 2 1];
vmini=0;
% if exist('minpuntslin2.mat','file'),
% load minpuntslin2.mat FF JJ;
% else
% syms x1 y1 x2 y2 a b c d;
% FF=[];
% JJ=[];
% comb=1;
% for in1=1:6,
% j0= indexs(in1,1);
% j1= indexs(in1,2);
% j2= indexs(in1,3);
% for in2=1:6,
% i0= indexs(in2,1);
% i1= indexs(in2,2);
% i2= indexs(in2,3);
%
% FF(i0,j0,comb)=(a*x1+b*y1)*x2+(c*x1+d*y1)*y2;
% FF(i0,j1,comb)=-a*x2-c*y2;
% FF(i0,j2,comb)=-b*x2-d*y2;
% FF(i1,j0,comb)=-a*x1-b*y1;
% FF(i1,j1,comb)=a;
% FF(i1,j2,comb)=b;
% FF(i2,j0,comb)=-c*x1-d*y1;
% FF(i2,j1,comb)=c;
% FF(i2,j2,comb)=d;
%
% for ff=1:3,
% for fc=1:3,
% JJ(1,3*(ff-1)+fc,comb)=diff(FF(ff,fc,comb),x1);
% end
% end
% for ff=1:3,
% for fc=1:3,
% JJ(2,3*(ff-1)+fc,comb)=diff(FF(ff,fc,comb),y1);
% end
% end
% for ff=1:3,
% for fc=1:3,
% JJ(3,3*(ff-1)+fc,comb)=diff(FF(ff,fc,comb),x2);
% end
% end
% for ff=1:3,
% for fc=1:3,
% JJ(4,3*(ff-1)+fc,comb)=diff(FF(ff,fc,comb),y2);
% end
% end
% for ff=1:3,
% for fc=1:3,
% JJ(5,3*(ff-1)+fc,comb)=diff(FF(ff,fc,comb),a);
% end
% end
% for ff=1:3,
% for fc=1:3,
% JJ(6,3*(ff-1)+fc,comb)=diff(FF(ff,fc,comb),b);
% end
% end
% for ff=1:3,
% for fc=1:3,
% JJ(7,3*(ff-1)+fc,comb)=diff(FF(ff,fc,comb),c);
% end
% end
% for ff=1:3,
% for fc=1:3,
% JJ(8,3*(ff-1)+fc,comb)=diff(FF(ff,fc,comb),d);
% end
% end
% comb=comb+1;
% end
% end
% save minpuntslin2.mat FF JJ;
% end
for ii=1:n;
nor =[];
Jact=[];
comb=1;
[vect1,val1]=eig(Fini);
[vect2,val2]=eig(Fini');
for in1=1:6,
j0= indexs(in1,1);
j1= indexs(in1,2);
j2= indexs(in1,3);
if imag(sum(val1(:,1)))==0,
vec1=vect1(:,1)./vect1(j0,1);
else
vec1=vect1(:,3)./vect1(j0,3);
end
x1=vec1(j1);
y1=vec1(j2);
for in2=1:6,
i0= indexs(in2,1);
i1= indexs(in2,2);
i2= indexs(in2,3);
if imag(sum(val2(:,1)))==0,
vec2=vect2(:,1)./vect2(i0,1);
else
vec2=vect2(:,3)./vect2(i0,3);
end
x2=vec2(i1);
y2=vec2(i2);
a=Fini(i1,j1);
b=Fini(i1,j2);
c=Fini(i2,j1);
d=Fini(i2,j2);
switch comb
case 1,
Jact= [ a*x2+c*y2, 0, 0, -a, 0, 0, -c, 0, 0;
b*x2+d*y2, 0, 0, -b, 0, 0, -d, 0, 0;
a*x1+b*y1, -a, -b, 0, 0, 0, 0, 0, 0;
c*x1+d*y1, -c, -d, 0, 0, 0, 0, 0, 0;
x1*x2, -x2, 0, -x1, 1, 0, 0, 0, 0;
y1*x2, 0, -x2, -y1, 0, 1, 0, 0, 0;
x1*y2, -y2, 0, 0, 0, 0, -x1, 1, 0;
y1*y2, 0, -y2, 0, 0, 0, -y1, 0, 1];
case 2,
Jact= [ a*x2+c*y2, 0, 0, -c, 0, 0, -a, 0, 0;
b*x2+d*y2, 0, 0, -d, 0, 0, -b, 0, 0;
a*x1+b*y1, -a, -b, 0, 0, 0, 0, 0, 0;
c*x1+d*y1, -c, -d, 0, 0, 0, 0, 0, 0;
x1*x2, -x2, 0, 0, 0, 0, -x1, 1, 0;
y1*x2, 0, -x2, 0, 0, 0, -y1, 0, 1;
x1*y2, -y2, 0, -x1, 1, 0, 0, 0, 0;
y1*y2, 0, -y2, -y1, 0, 1, 0, 0, 0];
case 3,
Jact= [ -a, 0, 0, a*x2+c*y2, 0, 0, -c, 0, 0;
-b, 0, 0, b*x2+d*y2, 0, 0, -d, 0, 0;
0, 0, 0, a*x1+b*y1, -a, -b, 0, 0, 0;
0, 0, 0, c*x1+d*y1, -c, -d, 0, 0, 0;
-x1, 1, 0, x1*x2, -x2, 0, 0, 0, 0;
-y1, 0, 1, y1*x2, 0, -x2, 0, 0, 0;
0, 0, 0, x1*y2, -y2, 0, -x1, 1, 0;
0, 0, 0, y1*y2, 0, -y2, -y1, 0, 1];
case 4,
Jact= [ -c, 0, 0, a*x2+c*y2, 0, 0, -a, 0, 0;
-d, 0, 0, b*x2+d*y2, 0, 0, -b, 0, 0;
0, 0, 0, a*x1+b*y1, -a, -b, 0, 0, 0;
0, 0, 0, c*x1+d*y1, -c, -d, 0, 0, 0;
0, 0, 0, x1*x2, -x2, 0, -x1, 1, 0;
0, 0, 0, y1*x2, 0, -x2, -y1, 0, 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -