1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
| I=imread('C:\Users\Aymen\Desktop\imm\mobiola-webcam-12.jpg');
I1=imread('C:\Users\Aymen\Desktop\tesstmatlab\app\yos9.tif');
I2=imread('C:\Users\Aymen\Desktop\tesstmatlab\app\yos10.tif');
N=8;
%function [X,Y] = clickPoints(I,N)
% I : image
% N : Nombre de points à cliquer
x = []; y = [];
winty = 10; wintx = 10; % Taille de la fenêtre de recherche
k=0;
while (k < N)
[xi,yi] = ginput(1); % Saisie dun point sur limage
[xxi,good,bad,type]= cornerfinder([xi;yi],I,winty,wintx);
if (good(1))
xi = xxi(1); yi = xxi(2);
X = [X;xi]; Y = [Y;yi];
k = k+1;
end
end;
%function F = fvnormal(u,v)
% u, v : vecteurs de coordonnées 2xN
% Normalisation des points
[u,nM1,na1] = normalizeu(u,'linear');
[v,nM2,na2] = normalizeu(v,'linear');
% Initialisations
N = size(u,2); A = [];
% Création du système linéaire
for i=1:N
A = [A;[u(1,i)*v(1,i) u(1,i)*v(2,i) u(1,i) u(2,i)*v(1,i) u(2,i)*v(2,i) u(2,i) v(1,i) v(2,i) 1]];
end
% Résolution du système linéaire
[Ui,Si,Vi] = svd(A);
Fbis = reshape(Vi(:,end),3,3);
% Contrainte sur F pour être de rang 2
[Uj,Sj,Vj] = svd(Fbis);
F = Uj*diag([Sj(1,1) Sj(2,2) 0])*Vj';
% De-normalisation
F = nM2'*F*nM1;
%function drawEpiLines(p1, p2, F, I1, I2)
% p1, p2 : vecteurs de coordonnée 2xN
% F : matrice fondamentale
% I1, I2 : images gauche et droite
% Affichage des images
h1 = figure; image(I1);hold on;
plot(p1(1,:), p1(2,:),'g+'); title('Image gauche');
h2 = figure; image(I2);hold on;
plot(p2(1,:),p2(2,:),'g+'); title('Image droite')
% Tracé des lignes épipolaires pour les points p1 et p2
x = 0:size(I1,2);
for i=1:size(p1,2)
% Points p1
tmp = F*[p1(1,i) p1(2,i) 1]'; tmp = tmp./tmp(3);
y = -tmp(1)/tmp(2)*x - tmp(3)/tmp(2);
% Tracé des droites dans limage de droite
[T Id] = find( y>0 & y<size(I1,1) );
figure(h2); plot(x(Id),y(Id),'b');
% Points p2
tmp = F'*[p2(1,i) p2(2,i) 1]'; tmp = tmp./tmp(3);
y = -tmp(1)/tmp(2)*x - tmp(3)/tmp(2);
% Tracé des droites dans limage de gauche
[T Id] = find( y>0 & y<size(I1,1) );
figure(h1); plot(x(Id),y(Id),'b');
end
% Calcul des épipoles : e1 = null(F); e2 = null(F);
[e1 e2] = getEpi(F);
% Tracé des épipoles
figure(h1); plot(e1(1),e1(2),'r+');
figure(h2); plot(e2(1),e2(2),'r+');
%function corners = findCorners(I,opsize,tresh,method,opt)
% I : image
% opsize : taille de lopérateur
% tresh : niveau de qualité (1-100)
% method : harris ou canny
% opt : calcul au subpixel près
switch lower(method)
case 'canny'
[gradient or] = canny(I, opsize);
% Elimination des max/min
im = nonmaxsup(gradient, or, 1.2);
[r,c] = nonmaxsuppts(im, 2, tresh);
case 'harris'
[cim, r, c] = harris(I, opsize, tresh*100, 3);
end
if (opt)
[corners ,good] = cornerfinder([c';r'],I,3,3);
else
corners = [c r];
end
%function p = findpoints(I,N,tresh,method,opt)
% I : image
% N : nombre de points voulus
% tresh : niveau de qualité (1-100)
% method : harris ou canny ou Kanade
% opt : calcul au subpixel près
imasize = size(I);
% Convertion en niveau de gris de la première image
I1 = I(:,:,:,1);
im1 = double(rgb2gray(I1));
% Réccupération automatique des coordonnées des coins
switch lower(method)
case 'kanade'
corners= cvGoodFeaturesToTrack(uint8(im1),2*N,1/Q,10);
case 'canny'
corners = findCorners(im1,5,Q,'canny',opt);
case 'harris'
corners = findCorners(im1,2,Q,'harris',opt);
end
p = [corners ones(length(corners),1)];
% Mise en correspondance des coins dans plusieurs images
for i = 2:imasize(4)
% Lecture de limage suivante
I2 = I(:,:,:,i); im2 = double(rgb2gray(I2));
% Calcul du flux optique pour trouver les correspondances
pv1 = []; pv2 = [];
[feat,err] = cvCalcOpticalFlowPyrLK(uint8(im1), uint8(im2), corners, pv1, [7 7], 3, [12 0.01]);
% Limitation au nombre de points voulus
[feat, p] = limitpoints(feat, N, p);
p = [p feat ones(length(corners),1)];
end
p = p'; |
Partager