Reconstruction 3D d'une ville à partir de photos: essais sur
Sherbrooke
Mini-projet dans le cours IFT786 / Session été 2005
Université de Sherbrooke
2005-08-04
Introduction
La reconstruction virtuelle de
scènes urbaines en 3D à partir d'images photo est
utilisée dans plusieurs applications. Il y a quelques
années, lorsqu'on voulait montrer un grand
projet de construction (complexe commercial, centre hospitalier,
etc.), les architectes et promoteurs nous
présentaient une belle maquette. De nos jours, pour nous
impressionner davantage,
on nous présente parfois des images ou même des animations
virtuelles de la future
construction, accompagnées de l'environnement actuel autour du
site. Les architectes peuvent aussi se servir de reconstructions
urbaines
pour valider leurs projets durant la phase de création.
Toutefois,
reconstruire une ville virtuelle à partir de photographies
aériennes ou prises au sol est un problème complexe. Dans
le présent rapport, plusieurs approches sont
résumées.
Parmi celles-ci, certaines idées ont été retenues
afin de réaliser un mini-projet sur la reconstruction du campus
ouest de l'Université de Sherbrooke.
État de l'art
Au cours des quinze dernières années, différentes
approches ont été proposées pour la reconstruction
3D de sites urbains. Ces approches sont très variées,
tant sur le plan des données nécessaires en entrée
que sur celui des types
de zone supportés (ex.: relief plat ou accidenté) et du
degré d'automatisation de la méthode. Les méthodes
dépendent aussi du degré de précision
désirée. Parfois, on peut se contenter d'une
reconstruction grossière alors que dans d'autres
cas, on veut
reproduire plus fidèlement un petit secteur.
Dans la
majorité des approches développées, le principe
de base consiste généralement à diviser le
problème de reconstruction en plusieurs sous-problèmes.
- Localiser les
bâtiments sur
une carte;
- Calculer le relief du terrain;
- Trouver la hauteur des
bâtiments;
- Trouver la forme des bâtiments (principalement les
toitures);
- Augmenter le réalisme de la scène (ex.: utilisation
de textures).
Selon les données disponibles, les
méthodes existantes tentent de résoudre un sous-ensemble
de ces sous-problèmes.
Plan de cadastre
Une façon simple et populaire de connaître la
localisation
de bâtiments est l'utilisation des plans de cadastre des
municipalités. Chaque fois qu'un permis de construction
est émis, le plan de cadastre de la municipalité est mis
à jour. Cette source d'information est donc d'une bonne
précision. L'information inscrite dans ces plans se limite
généralement à la localisation planaire (2D) de
la base du
bâtiment et de ses principales caractéristiques comme le
type
de bâtiment, le nombre d'étages, etc. Par contre, des
données comme la hauteur et la forme
architecturale ne sont souvent pas disponibles. De plus, le plan de
cadastre sous forme électronique, dans un SIG (système
d'information géographique), n'existe pas toujours.
Détection de bâtiments par imagerie aérienne ou
satellitaire
Une autre façon de trouver la localisation des bâtiments
dans une ville est l'utilisation d'images multispectrales
(aériennes ou
satellitaires) à haute résolution. Avec des algorithmes
de
segmentation prenant en compte des caractéristiques spectrales
et géométriques, on peut détecter la localisation
des principaux
bâtiments.
Détection de bâtiments par analyse du MNE et MNT
Il est également possible de détecter à la fois la
position et la hauteur des bâtiments
par l'usage d'un
modèle numérique d'élévation (MNE) et d'un
modèle numérique de terrain (MNT). Le MNE est une
représentation du relief brut d'une scène. Il inclut les
arbres, les bâtiments, etc. Par contre, le MNT est une
représentation du niveau du sol sans tenir compte des
bâtiments.
Pour détecter les bâtiments, il ne suffit que de faire la
différence entre le MNE et le MNT. La soustraction du MNE par le
MNT donne en quelque sorte tout ce qui dépasse du niveau du sol.
Pour discriminer les arbres des bâtiments, on peut analyser
la forme des segments ou avoir recours à des images
multispectrales de la zone d'études.
Génération d'un MNE par stéréovision
Une façon classique d'obtenir un modèle numérique
d'élévation (MNE) est le recours
à l'application d'algorithmes de stéréovision sur
des paires de photos aériennes. La génération des
MNE et des MNT est un problème bien documenté. Des
détails supplémentaires sont dans la section travail
effectué.
Génération d'un MNE avec capteur actif (laser)
Le
MNE peut aussi être généré à l'aide
d'équipements spécialisés comme un dispositif
laser déterminant l'élévation de points au sol. Le
recours au laser permet d'obtenir des MNE avec une très bonne
précision de l'ordre du décimètre près.
Dérivation d'un MNT à partir d'un MNE
Le modèle numérique de terrain (MNT) peut être
déduit à partir d'un MNE. En filtrant les "bosses" du
MNE, on peut obtenir un MNT.
Détermination des hauteurs de bâtiments par ombrages
Par
l'analyse des ombres des bâtiments, on peut déduire
la hauteur de ceux-ci. Plusieurs méthodes de détection
d'ombres
existent [10].
Détermination des hauteurs de bâtiments de
façon semi-automatique à l'aide d'outils interactifs
Dans certains cas, l'usage d'une méthode simple et
semi-automatique peut suffire pour effectuer une reconstruction en 3D.
En supposant qu'on a le MNT et le plan de cadastre d'une scène,
on peut déjà générer un premier
modèle 3D dans lequel les bâtiments ont une hauteur par
défaut. Ce modèle peut être affiché à
l'écran sous n'importe quel angle et l'utilisateur peut
éditer manuellement la hauteur des bâtiments à
l'aide de l'information qu'il dispose.
On peut aussi prendre des photos au sol ou sur le toit
des édifices offrant une bonne vue. Ces photos
peuvent être
superposées au modèle 3D initialement créé.
En trouvant des points de correspondance entre le modèle
virtuel et une photo, on peut déduire la position de la
caméra qui a capté l'image. Avec un nombre suffisant de
points (3), on peut aussi
trouver l'orientation de la caméra. En affichant le
modèle 3D par dessus la photo en arrière plan,
l'utilisateur peut récupérer l'information des hauteurs
avec une
bonne précision.
Forme des bâtiments
L'information qui est sans doute la
plus difficile à récupérer est la forme des
bâtiments. Puisqu'on s'intéresse
généralement qu'à obtenir la reconstruction
grossière d'une ville, on peut souvent se contenter de
représenter les bâtiments avec des primitives
géométriques simples. Par exemple, avec les quatre
primitives présentées ci-dessous, on peut approximer
une grande
proportion des bâtiments. Ces primitives peuvent être
paramétrées à l'aide de variables décrivant
la hauteur du bâtiment, les angles de toiture, etc.
Pour trouver quelle est la primitive
qui correspond le mieux à un bâtiment, plusieurs approches
sont possibles. Puisque les toitures sont généralement
constituées de surfaces diffuses et planaires, l'illumination
de ces dernières renferme des indices. On peut alors faire la
segmentation d'une image aérienne dans les zones où
se trouvent des bâtiments.
Figure tirée de [2].
Pour paramétrer les primitives de bâtiment, on peut
recourir au MNE. Avec les moindres carrés, on minimise
l'erreur entre le modèle virtuel et le MNE. Par contre, pour
que ce soit applicable, il faut disposer d'un MNE à une
très bonne précision.
Tout comme pour les hauteurs de bâtiments, on peut aussi utiliser
des outils interactifs. L'utilisateur sélectionne un
bâtiment et choisit la primitive qui correspond le mieux en
fonction de ce qu'on peut voir dans les images photo.
Formes complexes d'un groupe de bâtiments
Une situation difficile à traiter est les groupes
de bâtiments. Ces derniers, ne pouvant plus être
représentés par de simple primitives, doivent être
modélisés par des solides plus complexes. Ce
problème peut être résolu en décomposant la
base du bâtiment (tiré d'un plan de cadastre ou
détecté automatiquement) en un nombre minimal de
rectangles afin de couvrir l'ensemble du bâtiment. Ces rectangles
peuvent se chevaucher. Un exemple de décomposition est
montré ci-dessous :
|
Figure tirée de [2]
|
Les rectangles obtenus sont ensuite traités
indépendamment. Les toitures sont alors
détectées
pour chaque
rectangle de la même façon que s'il s'agissait d'un
bâtiment à part entière. Enfin, une dernière
étape consiste à faire la fusion des primitives obtenues.
Cette fusion
s'effectue comme une union de solides, qui est souvent utilisée
en infographie pour modéliser des objets complexes.
Figure tirée de [2]
Approche unifiée par séquences d'images
Grâce aux progrès récents en vision artificielle,
il
est maintenant possible de travailler avec des images provenant de
caméras non calibrées. En trouvant automatiquement des
points de correspondances entre deux images consécutives, un
calibrage automatique peut être effectué. Avec une suite
d'images, on peut effectuer le calcul de profondeur par
stéréovision à l'aide de différentes paires
d'images et ainsi reconstruire la surface d'une scène complexe
à l'aide de maillages de triangles [8]. Une application
particulière de cette
méthode est la reconstruction d'une ville où une ou
plusieurs caméras captent des séquences images en avion
ou sur terre [5]. L'avantage de ce type de méthode est
qu'elle est unifiée. Tout ce qu'on a besoin, c'est des
séquences d'images. Il n'est donc plus nécessaire
d'obtenir préalablement un MNT et de localiser les
bâtiments. De plus, le calcul des hauteurs et la
détermination les
formes des bâtiments se font implicitement. Un autre avantage est
l'augmentation du degré de réalisme par
l'extraction automatique de textures qui peuvent être
utilisées lors du rendu 3D.
Travail effectué
Approche choisie : une méthode automatique raffinée
par une méthode semi-automatique
Le choix de l'approche a été basé sur des
critères de faisabilité (temps et données
disponibles). Initialement, je me suis orienté
vers
une méthode automatique pour détecter à la fois la
position et la hauteur des bâtiments par l'analyse d'un MNE et
d'un MNT générés par
stéréovision.
En cours de route, puisque les
résultats du MNE n'étaient pas satisfaisants, j'ai
passé
à une méthode semi-automatique. Cette méthode,
expliquée dans [4],
consiste à évaluer les hauteurs à partir de photos
prises au sol que l'on superpose au modèle virtuel.
Données nécessaires
À la ville de Sherbrooke, le
plan de cadastre est disponible sous le format Shapefile. Réaliser un
programme pour importer ces données
représente un risque en raison du temps limité. De plus,
il y a un problème concernant la superposition de ces
données aux images aériennes. Afin d'être
superposables, ces deux sources de données doivent être
géoréférencées, une étape demandant
plusieurs heures de travail.
J'ai donc choisi de créer mon propre plan de cadastre
à
l'aide de polygones que je dessine sur une image aérienne. J'ai
donc limité ma scène à celle du campus
de l'Université de Sherbrooke.
Dans le but d'obtenir un MNE le plus
précis possible, il est nécessaire d'avoir des
images avec une bonne résolution spatiale. La
cartothèque
de l'Université de Sherbrooke
possède une bonne collection de photographies aériennes
de
l'Estrie. Ces photos proviennent de la
Photocartothèque
québécoise,
une institution publique rattachée au ministère des
Ressources naturelles du Québec. Les photos sont disponibles
à deux échelles : 1/40000 et 1/15000. Désirant la
meilleure précision possible, j'ai opté pour
l'échelle
1/15000, et ce, malgré le fait que les photos les plus
récentes à cette
échelle datent de juin 1998.
Ces photos ont été prises avec une caméra
soigneusement calibrée. De plus, elles sont
spécialement conçues pour reproduire le relief en 3D.
Deux photos subséquentes se chevauchent à environ 50 %
sur
le sens de largeur (direction est - ouest). Ces photos sont sous
format imprimé.
Les numéros d'images que j'ai choisis sont HMQ98-131-181 et
HMQ98-131-180. Ces images couvrent une zone qui inclut
entièrement le campus ouest de
l'Université de Sherbrooke. [
Voir infos sur
photos]
Afin de réaliser la partie
semi-automatique (pour déterminer la hauteur des
bâtiments), j'ai pris 44 photos à des endroits
stratégiques à l'aide d'un appareil photo
numérique.
- Points de
référence au sol :
Afin d'estimer la taille des pixels au
sol, j'ai besoin de quelques points de référence au sol.
J'ai obtenu des points à l'aide d'une image Ikonos
géoréférencée (Image Ikonos, octobre 2004,
disponible à la cartothèque, numéro de cote : G3432.S54S541 2005)
.
Étape #1 - Construction du relief par
stéréovision
Acquisition des images
J'ai numérisé les deux images à une
résolution de
1200 dpi, donnant des images
numériques de 11 400 x 11 400
pixels.
Afin de pouvoir utiliser les paramètres intrinsèques de
la
caméra, il faut retrouver le cadre original de l'image. Comme
indiqué dans le rapport de calibrage de la caméra
(voir annexe), le cadre de l'image est
délimité par
quatre marques aux coins de l'image (voir figure). À l'aide
d'une rotation et d'un cisaillement, j'ai
réaligné le cadre sur les axes X et Y de
l'image. Ces deux transformations affinées ont été
fusionnées en une seule étape. De plus, une interpolation
bilinéaire a été utilisée. Cette
étape a été réalisée par le
programme
CorrectImageScan, que j'ai
développé en Java et qui
utilise la librairie JAI (Java Advance
Imaging). J'ai par la suite découpé l'image en
passant par centre de ces marques.
Fig 1. Image numérisée avec les marques aux quatre
coins
Pseudo-code pour les transformations linéaires :
t = rotation(atan2(p3.x-p1.x,
p3.y-p1.y))
p1 = t(p1)
p2 = t(p2)
t *= cisaillement(0, -(p1.y-p2.y)/(p1.x-p2.x))
imageresult = t(imagesource)
Trace des opérations effectuées :
Image gauche : hmq98-131-181.pgm
p1 = (954, 929)
p2 = (10984, 951)
p3 = (901, 10931)
p4 = (10937, 10959)
|
Image droite : hmq98-131-180.pgm
p1 = (931, 931)
p2 = (10958, 996)
p3 = (834, 10934)
p4 = (10867, 11003)
|
Résultat :
hmq98-131-181_crop.pgm
|
Résultat :
hmq98-131-180_crop.pgm |
|
|
Après cette étape, j'ai obtenu deux images
corrigées ayant comme taille 10 036 x10 008 pixels. De plus, les
points
centraux des marques des deux images sont exactement aux mêmes
endroits et aux quatre extrémités des images.
Approche choisie pour la stéréovision
Bien que les paramètres intrinsèques de la caméra
soient parfaitement connus, les paramètres
extrinsèques ne
sont
connus qu'à une très faible précision. Le pilote
de l'avion tente de prendre des photos avec une direction de regard
s'approchant le plus possible de la droite perpendiculaire au sol. De
plus, il essaie d'aligner les axes de la caméra avec les axes
nord sud et ouest est. Par contre, en raison des perturbations de
l'air, il est très difficile d'avoir ces paramètres
exacts. Cela explique les légers décalages entre les deux
images.
Fig. 2 Positions de la caméra pour deux images successives.
Au lieu d'implanter l'algorithme à 8 points, j'ai choisi de
rectifier une image par rapport à une autre dans le but de
pouvoir
utiliser l'hypothèse que les directions de regard des deux
images sont parfaitement parallèles et que la direction de
déplacement de l'avion est alignée sur l'axe de largeur
des images. De cette façon, la géométrie
épipolaire se
simplifie à rechercher dans la même ligne de l'image de
droite.
Étape de rectification de l'image de droite
Afin de rectifier l'image de droite par rapport à celle de
gauche, j'ai identifié manuellement 4 points de correspondance
entre
les deux images. Idéalement, ces points doivent s'approcher du
rectangle englobant de la zone d'intérêt de la
scène, qui est dans ce cas-ci le campus de l'Université.
À partir de ces points, j'ai estimé une
rotation et une transformation perfective.
Cette étape est réalisée avec le programme
CorrectImagePerspective
(écrit en Java en utilisant la librairie
JAI).
|
|
Image gauche
|
Image droite
|
Pseudo-code pour les transformations linéaires :
# angle image gauche
langle = (atan2(p2l.x-p1l.x,
p2l.y-p1l.y) +atan2(p4l.x-p3l.x, p4l.y-p3l.y)) / 2
# angle image droite
rangle = (atan2(p2r.x-p1r.x,
p2r.y-p1r.y) +atan2(p4r.x-p3r.x, p4r.y-p3r.y)) / 2
# première transformation :
une rotation
t = rotation(rangle - langle)
# transformer les points de
l'image de droites
p1r = t(p1r)
p2r = t(p2r)
p3r = t(p3r)
p4r = t(p4r)
# Ajuster les Y de l'image droite
à celle de l'image gauche
t *= perspective( p1r ->
Point(p1r.x, p1l.y),
p2r -> Point(p2r.x, p2l.y),
p3r -> Point(p3r.x, p3l.y),
p4r -> Point(p4r.x, p4l.y))
imageresult = t(imagesource)
Résultat de rectification:
Image gauche non modifiée
|
Image droite rectifiée
par
rapport à l'image de
gauche
|
Récupération des paramètres extrinsèques
Avant de procéder à la stéréovision, il
faut
estimer le déplacement réel de la caméra.
Puisqu'on peut faire l'hypothèse que les directions de regard
de la caméra sont parfaitement parallèles et que le
déplacement de la caméra s'est fait de façon
alignée à l'axe des X de l'image, le déplacement
peut être estimé en regardant le décalage en
largeur entre les deux images.
Pour ce faire, j'ai identifié un point dans l'image de gauche
et un autre dans l'image de droite à la même
coordonnée pixel. La distance du déplacement de la
caméra peut être trouvée en mesurant la distance
géographique entre ces deux positions. Cela peut être fait
en se déplaçant physiquement aux deux endroits, et,
à
l'aide d'un récepteur GPS, en notant les coordonnées
géographiques. Enfin, en faisant la différence entre les
deux, on obtient la distance.
Dans mon cas, au lieu de me déplacer à ces endroits, j'ai
consulté une image géoréférencée (en
format GeoTIFF), prise par le satellite Ikonos. En retrouvant les
mêmes points dans l'image, je peux ainsi déduire les
coordonnées géographiques de ces points. Avec cette
méthode, j'ai calculé un déplacement d'environ
1524 m.
Pour vérifier si ce déplacement est significatif, j'ai
aussi calculé le déplacement noté par l'avion.
L'image HQM98-131-181 a été prise à la
coordonnée (Long=-71,93°, Lat=45,37°) et l'image
HMQ98-131-180 à la coordonnée (Long=-71,91°,
Lat=45,37°). Bien que ces données ne soient pas d'une grande
précision, la distance entre ces deux coordonnées
est de 1568 m.
Nouvelles hypothèses
À la suite de la rectification, j'ai établi de nouvelles
hypothèses :
- Les directions de regard de la caméra sont parfaitement
parallèles;
- Les positions de la caméra sont à la même
altitude;
- L'angle de la caméra est perpendiculaire avec le sol;
- Le déplacement de la caméra est parallèle
avec l'axe des x de l'image.
Algorithme de stéréovision implanté
À la base, l'algorithme implanté est très simple.
Pour chaque pixel de l'image de gauche, on recherche dans la
même ligne de l'image de droite le pixel correspondant. La mise
en
correspondance est effectuée par une simple corrélation
sur une fenêtre se déplaçant dans les deux images.
Comme les images utilisées sont de grande taille, ce premier
algorithme n'est pas très efficace. J'ai procédé
à une amélioration qui essaie de borner la région
de recherche dans l'image de droite. En supposant que le changement
d'altitude entre 2 points soit petit (<15 mètres), on peut
prédire
efficacement dans quel segment de ligne un pixel de l'image de gauche
apparaîtra dans l'image de droite.
Un autre problème à résoudre est celui des
régions fortement homogènes. À certains endroits
dans l'image, la dynamique est nulle. Afin d'éviter des
résultats arbitraires dans ces régions, deux mesures ont
été prises. La première consiste à prendre
une taille de fenêtre assez grande et la deuxième,
à utiliser une fonction d'énergie calculée
dans la fenêtre de l'image de gauche. Lorsque la valeur de cette
fonction d'énergie est trop faible, la profondeur de ce pixel
n'est pas calculée. La profondeur est alors mise à la
valeur du plus proche pixel (à défaut de faire une
interpolation).
Pseudo-code :
T
: déplacement de la caméra dans le sens ouest-est
f : distance focale
l : largeur du plan image
altitude[ *, * ] = Indéfinie
Pour tout (x, y) de
l'image de gauche
altitude_min = Min{ Min{altitude(x-10 à x-1, y)},
Min{altitude(x, y-10 à y-1)} }
altitude_max = Max{ Max{altitude(x-10 à x-1, y)},
Max{altitude(x, y-10 à y-1)} }
altitude_min -= 15
altitude_max += 15
scene_min = camera_gauche.convertir_en_coor_scene(x,
y, altitude_min)
scene_max = camera_gauche.convertir_en_coor_scene(x,
y, altitude_min)
rx1 =
camera_droite.convertir_en_coor_image(scene_min)
rx2 =
camera_droite.convertir_en_coor_image(scene_max)
mx = trouver_correspondance(rx1, y-1, rx2, y+1)
if(energy>seuil)
altitude[x,y] = f * T / (mx-x) * l
else
altitude[x,y] =
dernière_valeure(altitude[,])
Résultats :
Zone où le MNE est calculé
(Image d'origine à 2009 x 2002)
|
Résultat: mne_result2.pgm
(Taille fenêtre : 19 x 19)
|
Zone où le MNE est calculé
(Image d'origine à 2009 x 2002) |
Résultat: mne_result3.pgm
(Taille fenêtre : 15 x 15)
|
Meilleurs résultats obtenus (en
noir ce qui est le plus bas, en blanc ce qui est le plus haut).
Un MNE sous une vue en 3D
Filtrage du MNE
Le MNE précédemment obtenu est fortement
bruité
(des pics ressortent à plusieurs endroits). J'ai donc
procédé à quelques filtrages pour obtenir
un meilleur résultat. Une première passe a
été faite avec un filtre médian avec un
fenêtrage de 7x7 afin d'éliminer les valeurs
extrêmes. Par la suite, afin d'adoucir les courbes de niveau,
j'ai appliqué un filtre gaussien. Enfin, pour ne pas surcharger
OpenGL, j'ai réduit la taille de mon MNE à une
résolution de 256 x 255.
MNE filtré.
MNE filtré en 3D avec l'image aérienne en texture 2D.
Corrections géométriques
Aucune correction géométrique n'a été
faite.
Normalement, avant
d'utiliser le MNE (ou l'image aérienne elle-même) comme
une carte, il
faut corriger les distorsions géométriques
engendrées par le relief du
terrain.
Validation quantitative
Aucune validation n'a été faite sur le MNE
résultant. Pour la suite du mini-projet, j'ai supposé que
le MNE obtenu était bon.
Étape #2 - Carte du campus ouest
Puisque l'usage d'un vrai plan de cadastre a été mis
de côté, la construction de la carte se fait manuellement
à l'aide d'un
petit "Widget" écrit en C++/QT. En arrière plan, une
image
aérienne est affichée. Sur le dessus, je dessine des
polygones formant les bâtiments. Cette étape aurait pu
être remplacée, ou du moins, initialisée par une
méthode automatique segmentant l'image.
Pour ajouter un bâtiment, il suffit de cliquer sur le bouton
droit, de choisir "Insérer bâtiment", de cliquer avec le
bouton
gauche sur les coins du bâtiment dans l'image et de terminer avec
le
bouton droit. Il sera ensuite possible de corriger ces points un
à un en les déplaçant.
Limites et points à améliorer :
- L'image aérienne utilisée n'est ni
orthorectifiée ni géoréférencé :
la taille réelle (largeur et longueur) des bâtiment est
forcément imprécise en raison des distorsions dans
l'image engendrées par le relief.
- Pour faciliter le travail manuel de l'édition de la carte,
une option de grille magnétique attirant les sommets et les
arrêtes vers les jonctions et les contours de l'image serait
grandement utile.
Étape #3 - Première passe pour le calcul des hauteurs
Les
bâtiments sont placés sur un MNE précédemment calculé.
L'élévation du
bâtiment est déterminée en trouvant une valeur
minimale du MNE située à proximité du
bâtiment. La hauteur du bâtiment est
déterminée en trouvant une valeur maximale du MNE
à l'emplacement du bâtiment. Cette première
attribution est faite lors de la création d'un nouveau
bâtiment.
Étape #4 - Correction manuelle des hauteurs
Finalement, comme dernière étape, des photos ont
été superposées au modèle virtuel afin de
corriger la hauteur de certains bâtiments.
Photo du monde réel.
|
Rendu du modèle virtuel.
|
Superposition de la photo et scène 3D
(pas très visible par contre).
|
Analyse de la superposition (attention:
les lignes rouges et bleues ont été ajoutées
sur la capture de l'écran).
|
Sur l'analyse (voir image #4), les lignes rouges représentent
les frontières du pavillon central sur
la photo et les lignes bleues sont les frontières du
modèle 3D. On voit clairement que la hauteur du pavillon
central est trop grande sur le modèle 3D par rapport à
la photo correspondante. De plus, le centre culturel ne devrait pas
être visible sous cet angle.
Problèmes rencontrés
Le MNT obtenu, qui est en réalité encore un MNE, n'est
pas encore bien filtré. Certains obstacles, principalement des
arbres, dépassent du sol et cachent certains angles. Il y a
aussi
des zones entre les bâtiments rapprochés qui causent
problème. Le niveau du terrain fait une pente à
côté des bâtiments. Sur certaines photos prises
entre deux bâtiments (ex.: entre le A1 et A2), il n'est
pas possible de placer la caméra virtuelle au même
endroit,
car elle est sous le niveau du terrain. Il est donc difficile de
trouver des points de repère pour corriger la hauteur des
bâtiments. De plus, étant donné que le MNE est
encore imparfait, fixer des points de repère sur ce dernier est
un élément d'incertitude.
Procédure pour voir
une photo:
- Aller dans l'éditeur de carte
- Bouton droit : ajouter une photo
- Parcourir le disque et choisir une image photo
- Entrer les paramètres demandés
- Revenir dans le modèle 3D et appuyer sur "i" pour voir
l'image superposée
- Déplacer la caméra : les flèches du clavier,
page up/down, bouton gauche de la souris + drag, etc.
- Lorsque la caméra est bien placée, pour lier la
position
à la photo, appuyer sur la touche "p"
- Des points de correspondances peuvent être ajoutés
- appuyer sur la touche "s" pour voir les sommets
- cliquer (gauche) sur un sommet pour le sélectionner
- cliquer (droit) sur le point correspondant dans la photo
- appuyer sur "l" pour lier la correspondance
- une ligne rouge relira les 2 points
Résultats et Conclusion
Résultat obtenu.
Le résultat obtenu des
bâtiments n'est pas si mal. On peut y reconnaître la forme
des principaux bâtiments de l'UdeS. En traitant mieux le MNT
utilisé, on pourrait réduire les pentes entourant les
édifices. En résumé, la détermination des
hauteurs de bâtiment par le MNE constitue déjà un
bon
début. Sur le résultat plus haut, seulement quelques
corrections ont été faites, à partir de photos ou
d'informations connues quant à la taille relative entre certains
bâtiments.
Enfin, certains points importants seraient à améliorer.
Il faudrait entre autres améliorer l'implémentation de
l'algorithme de stéréovision utilisé pour
générer le MNE. Une approche à plusieurs passes
sur plusieurs échelles devrait améliorer la
qualité et le temps de calcul nécessaire pour la
génération du MNE. De plus, une meilleure technique de
mise en correspondance serait à utiliser. Avec ces deux
améliorations, on pourrait revenir à une
résolution plus fine des images aériennes
utilisées et obtenir une meilleure indication sur les hauteurs
de bâtiments. Il faudrait aussi travailler sur les toitures.
Actuellement, seuls les toits plats sont supportés. Par
chance, le campus ouest de l'UdeS ne contient pratiquement que des
toits de ce type, à l'exception des nouvelles résidences.
Codes source et binaire
Interface du mini-projet:
Notes :
- Compatible sous Windows (VC++
.NET 2003), Linux (GCC <=3.3) et probablement MacOS.
- Le programme de
stéréovision est séparé (voir
stereo_ortho.h/cpp) de l'interface graphique principale pour des
raisons techniques. Malheureusement, l'interface commune
réalisée en QT du groupe n'est pas conçue pour
supporter de très grandes images. Le chargement d'une image
moyenne de 2500x2500 pixels consomme énormément de
ressources. En premier lieu, la représentation interne dans
l'interface est basée sur la classe NVImg (de nvlib), qui elle
est
basée sur une matrice de réels en double 64 bits (ou float 32 bits?).
De plus, pour afficher l'image à l'écran, on doit passer
par la classe QPixmap de QT. Un QPixmap est un objet
spécialement conçu pour afficher des images. Or, pour
être efficace, la représentation d'un QPixmap doit
être allignée avec la configuration d'affichage du
système d'exploitation. Ainsi, même si nous n'ouvrons
qu'une
image à une seule bande (niveaux de gris), elle est
transformée en format RGB 24 bits our RBGA 32 bits pour
l'affichage. Pour conclure, les représentations de NVImg et de
QPixmap utilisées dans le projet consomment beaucoup de
mémoire. C'est donc pour cette raison qu'un petit programme
séparé a été fait pour l'algorithme de
stéréovision.
Programmes outils en Java:
- CorrectImageScan.java
- CorrectImagePerpective.java
Note
: Certains outils ont
été réalisés en Java pour des raisons
techniques. Ayant besoin d'opérateurs géométriques
(transformation warp affine: rotation, perspective,
...) avec
interpolation bilinéaire, j'ai préféré
utiliser la librairie JAI (Java Advanced
Imaging)
déjà faite plutôt que de les implanter. De plus,
JAI
est conçu pour traiter de très grandes images sans les
charger complètement en mémoire.
Présentation
Annexe: Images et données
Les données utilisées pour le projets sont dans le
répertoire data du CD
fournis.
Images aériennes sources :
Photos prises au sol :
Images et résultats
intermédiaires :
Résultats (MNE) :
Fichiers finaux :
- Voir répertoire ville3d
sur le CD. Il y a un fichier test.ville
qui est un fichier texte pour la représentation de ma ville. Il
contient la représentation du campus de l'UdeS reconstruit.
À l'intérieur de ce fichier, il y a des
références vers l'image aérienne et celle du MNT.
Pour
l'instant, ces fichiers sont donnés par un chemin absolu ou par
un
chemin relatif par rapport au répertoire courant (d'où
l'exécutable est lancé).
- udes.pgm
: zone découpée du campus de l'UdeS, tirée de
l'image aérienne et utilisée comme texture avec OpenGL
pour faire le rendu du terrain
- mnt2.pgm : MNT/MNE filtré utilisé pour la
reconstruction 3D du campus
Bibliographie
[1] C. Baillard et M. Maître. 3-D Reconstruction of Urbain
Scenes from Aerial Stereo Imagery: a Focusing Strategy, 1998.
[2] C. Brenner et N. Haala. Fast Production of virtual reality
city models. In: Proceedings ISPRS Comm. IV Symposium, Stuttgart, Sept.
7-10., 1998, IAPR, Vol. 32, Part 4.
[3] R.T. Collins, A.R. Hanson, E.M. Riseman et H. Schultz.
Automatic Extraction of Buildings and Terrain from Aerial Images.
Internationnal workshop on automatic extraction of man-make objects
from aerial and spaces images. April 1997, p169-179.
[4] C. Chevrier et J.P. Perrin. Interactive 3D reconstruction for
urban areas: an image based tool. [PDF]
[5] O. Faugeras, L. Robert, S. Laveau, G. Csurka, C. Zeller, C. Gauclin
et I. Zoghlami. 3-D Reconstruction of Urban Scenes from Image
Sequences. Computer Vision and Image Understanding. Vol 69, no 3,
March, p. 292-309, 1998.
[6] N. Haala et C. Brenner. Extraction of building and trees in urban
environnements, Joural of Photogrammetry & Remote Sensing 54 (1999)
130-137.
[7] Y-P. Hung, C-S. Chen, K-C. Hung, Y-S Chen, C-S. Fuh.
Multipass hierarchical stereo matching for generation of digital
terrain models from aerial images. Machine Vision and Application
(1998) 10: 280-191.
[8] R. Koch, M. Pollefeys,
L. Van Gool, Realistic
surface reconstruction of 3D scenes from uncalibrated image sequences, Journal Visualization and
Computer Animation, Vol. 11, pp. 115-127, 2000.
[9] H-Y. Lee, T. Kim, W. Park et H.K. Lee. Extraction of digital
elevation models from satellite stereo images through stereo matching
based epipolarity and scene geometry. Elsevier, Image and Vision
Computing, 21 (2003) 789-796.
[10] Massalabi, A., D. C. He et G. B. Bénié.
Détection et exploitation des zones d'ombre sur les images de
très haute résolution spatiale en milieu urbain :
application aux données IKONOS de Sherbrooke. AQT et CASI. 25e
Symposium canadien sur la télédétection.
Montréal, Québec, Canada. 14-17 octobre 2003.
[11] R. Nevatia, C. Lin et A. Huertas. A System for Building
Detection from Aerial Images. 1997
[12] E. Trucco et A. Verri. Introductory Techniques for 3-D Computer
Vision. Prentice Hall, 1998.
(C) Eric Beaudry 2005.
Tous droits réservés.