M2E3A - Systèmes Automatique Mobiles - Université d'Evry - Université Paris Saclay
Perception - TC2 - G1
TP : Détection des obstacles avec la v-disparité
Pr. J.-P. Tarel
Université de Gustave Eiffel
Fait par
Kheir Eddine BELLAHCENE
Promotion 2023 - 2024
1. Afficher les images 01G et 01D superposées en anaglyphe avec stereoAna-glyph. Que concluez-vous sur la géométrie épipolaire de la paire stéréoscopique ?
title("Image de la caméra droite")
title("Image de la caméra gauche")
J = stereoAnaglyph(I1,I2);
Commentaire:
On remarque de la figure que le décalage est sur l'axe horizontal et les deux caméras sont au meme niveau(sont bien calibré), donc les images sont bien à géometrie rectifiée.
disp_max = 108-26= 82 et donc on choisit 80 le multiple de 16 le plus proche
disparityRange=[0,80];%disp range
2. Carte de disparité : en travaillant avec les images en niveau de gris, calculer la carte de disparité en utilisant avec au choix la fonction Disparity,DisparityBM ou Disparity SGM de la computer vision toolbox. Attention à bien définir l’interval des disparités recherchées. Dans quel espace est défini la carte de disparité ?
I1D=rgb2gray(I1); %passage en niveaux de gris
dispMap1 = disparity(I1G,I1D,'DisparityRange', disparityRange);
dispMap1=dispMap1/max(max(dispMap1));%normalisation pour affichage
title('Carte de diparité 1')
dispMap2 = disparityBM(I1G,I1D,'DisparityRange',disparityRange);
%normalisation pour affichage
dispMap2=dispMap2/max(max(dispMap2));%normalisation pour affichage
title('Carte de diparité 2')
dispMap3= disparitySGM(I1G,I1D,'DisparityRange',disparityRange);
dispMap3=dispMap3/M;%normalisation pour affichage
title('Carte de diparité 3')
La carte de disparité appartient à l'espace tridimensionnel
On choisit d'utiliser la version SGM de la disparité car cette dernière présente des résultat bon.
3.Détection des obstacles
1. v-disparité :
hist=zeros(size(disp,1),M);%carte (v,d) qui a comme 2eme dimension la valeur de Imax de disp
hist(i,disp(i,j))=hist(i,disp(i,j))+1;
imshow(hist,[])%affichage normalisé de hist pour affiner la ligne
title('Carte v-disparité')
Commentaire:
On remarque une ligne transversale qui représente plus ou moins le profil de la route puisque la disparité démarre de 0 disparité et augmente à fur et à mesure qu'on se rapproche de la caméra i.e de moins en moins de profondeur. Et cette ligne affine est traversée par une ligne verticale.
2. Profil de la route :
On a :
x=d et y= -v
B=robustfit(d,-v);% lié à Svd1=15
B1=robustfit(d1,-v1);%lié à Svd2=25
B2=robustfit(d2,-v2);%lié à Svd3=35
plot(d,B(1)+B(2)*d,'red','LineWidth',2)
title(['Résultat de la régression pour Svd = ',num2str(Svd1)])
plot(d1,B1(1)+B1(2)*d1,'red','LineWidth',2)
title(['Résultat de la régression pour Svd = ',num2str(Svd2)])
plot(d2,B2(1)+B2(2)*d2,'red','LineWidth',2)
title(['Résultat de la régression pour Svd = ',num2str(Svd3)])
Commentaire:
Le choix de la valeur de seuil est crucial pour trouver l'équation du profil ; puisqu'en choisissant un seuil faible, on prendrai davantage de points et donc la ligne penche pour se trouver au dessous de la ligne du profile souhaité.
Au contraire, si on choisit un seuil trop élevé, on exclut alors les pixels du bas et la régression suivra le bruit en haut de la carte, ce qui n'est pas le but.
On choisit alors un seuil modéré de Svd= 15
Donc on prend B comme coefficient de l'équation de la ligne qui décrit au mieux le profile de la route dans le repère standard (x,y) et Bf dans le repère image (d,v)
alors : y = 1.8812*x + 101.1839
v = 1.8812*d + 101.1839
3. Obstacles :
hist2=zeros(1,size(hist,2));
title("Histogramme en disparité pour l'obstacle")
On voit bien que l'obstacle correspond à la disparité la plus élevée sur l'histogramme ; on seuille alors à partir de 25
V_obs= [ V_obs floor(Bf(2)*i+Bf(1)) ];% avec i=D_obs
Vu qu'on a un seul obstacle saillant on choisit une seule valeur qui est la plus grande (la plus proche aussi ) pour trouver le v correspondant en utilisant l'équation qu'on nommera V_obs
*Cette valeur correspond au v à partir duquel il y a l'obstacle dans l'image détectée par les caméras.
*On trace une ligne à V_obs pour afficher sur l'image la limite de l'obstacle.
I2(V_obs,:,1) = 255;% code RGB du rouge
title("La ligne de détection de l'obstacle")
Application des traitement sur les images 02G et 02D
1. Afficher les images 01G et 01D superposées en anaglyphe avec stereoAna-glyph. Que concluez-vous sur la géométrie épipolaire de la paire stéréoscopique ?
title("Image de la caméra droite")
title("Image de la caméra gauche")
J = stereoAnaglyph(I1,I2);
title('Le résultat de stéreoAnaglyph')
disp_max= 89-5 = 84 et donc on choisit 80
disparityRange=[0,80]; %disparity range
2. Carte de disparité : en travaillant avec les images en niveau de gris, calculer la carte de disparité en utilisant avec au choix la fonction Disparity,DisparityBM ou Disparity SGM de la computer vision toolbox. Attention à bien définir l’interval des disparités recherchées. Dans quel espace est défini la carte de disparité ?
dispMap1 = disparity(I1G,I1D,'DisparityRange',disparityRange);
dispMap1=dispMap1/max(max(dispMap1));%normalisation pour affichage
title('Carte de diparité 1')
dispMap2 = disparityBM(I1G,I1D,'DisparityRange',disparityRange);
%normalisation pour affichage
dispMap2=dispMap2/max(max(dispMap2));%normalisation pour affichage
title('Carte de diparité 2')
dispMap3= disparitySGM(I1G,I1D,'DisparityRange',disparityRange);
dispMap3=dispMap3/M;%normalisation pour affichage
title('Carte de diparité 3')
Commentaire:
La carte de disparité appartient à l'espace tridimensionnel
On choisit d'utiliser la version SGM de la disparité car cette dernière est inversement proportionnelle à la profendeur dans l'image ; on voit bien une disparité quasi-nulle sur la ligne de l'horizon et des valeurs plus élevées en se rapprochant du bas de l'image.
3.Détection des obstacles
1. v-disparité :
dispMap3=dispMap3*M;%dénormalisation
hist=zeros(size(disp,1),M);%carte (v,d) qui a comme 2éme dimension la valeur de Imax de disp
hist(i,disp(i,j))=hist(i,disp(i,j))+1;
imshow(hist,[])%affichage normalisé de hist pour affiner la ligne
title('Carte v-disparité')
title('Vérité de terrain')
Commentaire:
On remarque une ligne transversale qui représente plus ou moins le profil de la route puisque la disparité démarre de 0 disparité et augmente à fur et à mesure qu'on se rapproche de la caméra c-à-d de moins en moins de profondeur. Et cette ligne affine est traversée par deux lignes verticales, une vers la gauche et l'autre au milieu.
2. Profil de la route :
On a: x=d et y= -v
B=robustfit(d,-v);% lié à Svd1=5
B1=robustfit(d1,-v1);%lié à Svd2=10
B2=robustfit(d2,-v2);%lié à Svd3=20
plot(d,B(1)+B(2)*d,'red','LineWidth',2)
title(['Résultat de la régression pour Svd = ',num2str(Svd1)])
plot(d1,B1(1)+B1(2)*d1,'red','LineWidth',2)
title(['Résultat de la régression pour Svd = ',num2str(Svd2)])
plot(d2,B2(1)+B2(2)*d2,'red','LineWidth',2)
title(['Résultat de la régression pour Svd = ',num2str(Svd3)])
*Après plusieurs comparaisons, on remarque que plus le seuil est élevé plus on supprime de points avec les grandes disparités, ce qui influence la pente de la courbe ; on a choisit un seuil qui garantit un nombre considérable de points sur toute la ligne.
*On choisit alors un seuil de Svd= 10
Donc on prend B1 comme coefficient de l'équation de la ligne qui décrit au mieux le profile de la route dans le repère standard (x,y) et Bf dans le repère image (d,v)
alors : y = 2.01541*x + 95.0265
v = 2.01541*d + 95.0265
3. Obstacles :
hist2=zeros(1,size(hist,2));
title("Histogramme en disparité pour l'obstacle")
On voit bien que les obstacles correspondent aux disparités les plus élevées sur l'histogramme ; on seuille alors à partir de 11
V_obs= [ V_obs floor(Bf(2)*i+Bf(1)) ];% avec i=D_obs
V_obs
97 99 101 103 105 107 133 135
Ces valeurs correspondent aux valeurs de V_obs à partir duquel on trouve les obstacles dans l'image détectée par les caméras.
On choisit comme d'habitude la valeur de V_obs la plus grande pour trouver la limite de l'obstacle le plus proche.
I2(V_obs,:,1) = 255;% code RGB du rouge
title("La lignes de détection de l'obstacle")
Application des traitement sur les images 03G et 03D
1. Afficher les images 01G et 01D superposées en anaglyphe avec stereoAna-glyph. Que concluez-vous sur la géométrie épipolaire de la paire stéréoscopique ?
title("L'image de la caméra droite")
title("L'image de la caméra gauche")
J = stereoAnaglyph(I1,I2);
title('Le résultat de stéreoAnaglyph')
On voit bien que le décalage sur l'axe horizontal et que les deux caméras sont au meme niveau, donc les images sont bien à géometrie rectifiée.
disp_max= 89-1 = 88 et donc on choisit 80
disparityRange=[0,80];%disparity range
2. Carte de disparité : en travaillant avec les images en niveau de gris, calculer la carte de disparité en utilisant avec au choix la fonction Disparity,DisparityBM ou Disparity SGM de la computer vision toolbox. Attention à bien définir l’interval des disparités recherchées. Dans quel espace est défini la carte de disparité ?
dispMap1 = disparity(I1G,I1D,'DisparityRange',disparityRange);
dispMap1=dispMap1/max(max(dispMap1));%normalisation pour affichage
title('Carte de diparité 1')
% 0 Asswad et 256 ou 1 Abyadh
dispMap2 = disparityBM(I1G,I1D,'DisparityRange',disparityRange);
%normalisation pour affichage
dispMap2=dispMap2/max(max(dispMap2));%normalisation pour affichage
title('Carte de diparité 2')
dispMap3= disparitySGM(I1G,I1D,'DisparityRange',disparityRange);
dispMap3=dispMap3/M;%normalisation pour affichage
title('Carte de diparité 3')
La carte de disparité appartient à l'espace tridimensionnel
On choisit d'utiliser la version SGM de la disparité car cette dernière est inversement proportionnelle à la profondeur dans l'image ; on voit bien une disparité quasi-nulle sur la ligne de l'horizon et des valeurs plus élevées en se rapprochant du bas de l'image.
3.Détection des obstacles
1. v-disparité :
dispMap3=dispMap3*M;%dénormalisation
hist=zeros(size(disp,1),M);%carte (v,d) qui a comme 2éme dimension la valeur de Imax de disp
hist(i,disp(i,j))=hist(i,disp(i,j))+1;
imshow(hist,[])%affichage normalisé de hist pour affiner la ligne
title('Carte v-disparité')
title('Vérité de terrain')
On remarque une ligne transversale qui représente plus ou moins le profil de la route puisque la disparité démarre de 0 disparité et augmente à fur et à mesure qu'on se rapproche de la caméra c-à-d de moins en moins de profondeur. Avec plusieurs lignes verticales qui la traversent.
2. Profil de la route :
On a: x=d et y= -v
B=robustfit(d,-v);% lié à Svd1=5
B1=robustfit(d1,-v1);%lié à Svd2=10
B2=robustfit(d2,-v2);%lié à Svd3=20
plot(d,B(1)+B(2)*d,'red','LineWidth',2)
title(['Résultat de la régression pour Svd = ',num2str(Svd1)])
plot(d1,B1(1)+B1(2)*d1,'red','LineWidth',2)
title(['Résultat de la régression pour Svd = ',num2str(Svd2)])
plot(d2,B2(1)+B2(2)*d2,'red','LineWidth',2)
title(['Résultat de la régression pour Svd = ',num2str(Svd3)])
*Après plusieurs comparaisons, on remarque que plus le seuil est élevé plus on supprime de points avec les grandes disparités, ce qui influence la pente de la courbe ; on a ainsi choisit un seuil qui garantit un nombre considérable de points sur toute la ligne.
*On choisit alors un seuil de Svd= 10
Donc on prend B1 comme coefficient de l'équation de la ligne qui décrit au mieux le profile de la route dans le repère standard (x,y) et Bf dans le repère image (d,v)
alors : y = 1.9097*x + 98.1828
v = 1.9097*d + 98.1828
3. Obstacles :
hist2=zeros(1,size(hist,2));
title("Histogramme en disparité pour l'obstacle")
*On voit bien que les obstacles correspondent aux disparités les plus élevées sur l'histogramme ; on seuille alors à partir de 12
V_obs= [ V_obs floor(Bf(2)*i+Bf(1)) ];% avec i=D_obs
V_obs
100 102 103 105 111 119 121 249
V_obs=min(V_obs)% V_obs optimal
*Ces valeurs correspondent aux valeurs de v à partir duquel on trouve les obstacles dans l'image détectée par les caméras.
I2(V_obs,:,1) = 255;% code RGB du rouge
title("La ligne de détection de l'obstacle")