TP-probleme-inverse-3D/TP1/exercice_0.m
2023-06-25 16:38:01 +02:00

117 lines
2.8 KiB
Matlab

clear;
close all;
taille_ecran = get(0,'ScreenSize');
L = taille_ecran(3);
H = taille_ecran(4);
% Choix des images :
% dossierImages = 'Gargouille/';
dossierImages = 'Fontaine/';
im1 = 1;
im2 = 2;
% ext = '.JPG';
ext = '.png';
% Redimensionnement des images :
facteur = 1;
% Images à la verticale :
% verticale = 1;
verticale = 0;
% Utilisation des régions d'intérêt :
ROI = 0;
% Options :
affichage = 1; % 0 pour éviter les affichages
nb_p_affiches = 400;
% Noms des images :
nom_1 = strcat(dossierImages,int2str(im1),ext);
nom_2 = strcat(dossierImages,int2str(im2),ext);
% Lecture des images :
I_1 = imresize(imread(nom_1),facteur);
I_2 = imresize(imread(nom_2),facteur);
if verticale
I_1 = permute(I_1, [2,1,3]); % On inverse lignes et colonnes
I_1 = I_1(end:-1:1,:,:); % On remet l'image à l'endroit
I_2 = permute(I_2, [2,1,3]); % On inverse lignes et colonnes
I_2 = I_2(end:-1:1,:,:); % On remet l'image à l'endroit
end
% Détection des points d'intérêt :
[nb_lignes,nb_colonnes,nb_canaux] = size(I_1);
I_1_nvg = rgb2gray(I_1);
I_2_nvg = rgb2gray(I_2);
if ROI
RI_1 = selection_RI(I_1,L,H);
p_1 = detectMinEigenFeatures(I_1_nvg,'ROI',RI_1,'MinQuality',0.0001);
RI_2 = selection_RI(I_2,L,H);
p_2 = detectMinEigenFeatures(I_2_nvg,'ROI',RI_2,'MinQuality',0.0001);
else
p_1 = detectMinEigenFeatures(I_1_nvg,'MinQuality',0.0001);
p_2 = detectMinEigenFeatures(I_2_nvg,'MinQuality',0.0001);
end
% Affichage des images et des points d'intérêt :
if affichage
figure('Name','Detection des points d''interet','Position',[0.1*L,0.4*H,0.8*L,0.5*H]);
subplot(1,2,1);
imagesc(I_1);
title('Image gauche','FontSize',20);
axis equal;
axis off;
hold on;
plot(p_1.selectStrongest(nb_p_affiches));
subplot(1,2,2);
imagesc(I_2);
title('Image droite','FontSize',20);
axis equal;
axis off;
hold on;
plot(p_2.selectStrongest(nb_p_affiches));
end
% Mise en correspondance :
traqueur = vision.PointTracker('MaxBidirectionalError',1,'NumPyramidLevels',5);
p_1 = p_1.Location;
initialize(traqueur,p_1,I_1);
[p_2,indices_droite] = step(traqueur,I_2);
p_1_apparies = p_1(indices_droite,:);
p_2_apparies = p_2(indices_droite,:);
nb_paires = size(p_1_apparies,1);
% Affichage des appariements :
if affichage
figure('Name','Mise en correspondance');
pas_affichage = max(floor(nb_paires/nb_p_affiches),1);
showMatchedFeatures(I_1,I_2,p_1_apparies(1:pas_affichage:end,:),p_2_apparies(1:pas_affichage:end,:));
end
% Paramètres intrinsèques de la caméra :
nomFichier = strcat(dossierImages,'matK.mat');
load(nomFichier);
if verticale
u0 = K(1,3);
v0 = K(2,3);
K(1,3) = v0;
K(2,3) = u0;
end
if facteur~=1
K = K*facteur;
K(3,3) = 1;
end
inverse_K = inv(K);
save('donnees_appariees.mat','K','inverse_K','p_1_apparies','p_2_apparies','nb_paires','I_1','I_2','nb_lignes','nb_colonnes');