Photogrammétrie Python : L'Art de la Reconstruction 3D

Transformer de simples images 2D en modèles 3D denses via Structure-from-Motion (SfM) et Multi-View Stereo (MVS).
Intermédiaire
60 min
COLMAP, Python, Meshroom
"La photogrammétrie n'est pas magique, c'est de la géométrie projective pure. Si vous comprenez la triangulation, vous pouvez reconstruire le monde avec un smartphone."

1. Le Pipeline SfM (Structure-from-Motion)

Le SfM est le cœur du réacteur. Il retrouve simultanément la position des caméras (Motion) et la géométrie de la scène (Structure). Cela se fait en détectant des points distinctifs (Features type SIFT) et en les faisant correspondre entre les images.

3D Feature (Tie Point) Cam 1 Cam 2

2. Automatisation avec COLMAP et Python

COLMAP est l'état de l'art open-source. Bien qu'il ait une GUI, nous voulons l'utiliser en ligne de commande (CLI) pilotée par Python pour traiter des datasets en masse.

sfm_batch.py
import subprocess

def run_colmap(project_path):
    database = project_path + "/database.db"
    images = project_path + "/images"
    
    # 1. Feature Extraction
    subprocess.run([
        "colmap", "feature_extractor",
        "--database_path", database,
        "--image_path", images
    ])
    
    # 2. Exhaustive Matching
    subprocess.run([
        "colmap", "exhaustive_matcher",
        "--database_path", database
    ])
    
    # 3. Mapper (Reconstruction)
    subprocess.run([
        "colmap", "mapper",
        "--database_path", database,
        "--image_path", images,
        "--output_path", project_path + "/sparse"
    ])

Ce script simple remplace des heures de clics manuels. Pour les grands datasets (>50 images), remplacez exhaustive_matcher par vocab_tree_matcher pour passer d'une complexité O(N²) à O(N).

3. Multi-View Stereo (MVS) : Vers la Densité

Le SfM ne produit qu'un nuage épars (Sparse Cloud). Le MVS prend le relais pour calculer la profondeur de chaque pixel pour chaque image, générant des cartes de profondeur (Depth Maps) fusionnées ensuite en un nuage dense.

Tech Tip: Le MVS est extrêmement gourmand en VRAM GPU. Assurez-vous d'avoir une carte NVIDIA CUDA-compatible avec au moins 8 Go de VRAM pour traiter du 4K.

4. Post-Traitement et Maillage

Une fois le nuage dense obtenu, nous utilisons Poisson Surface Reconstruction pour créer un maillage (Mesh) étanche.

mesh_gen.py
import open3d as o3d

def poisson_mesh(pcd_path, depth=9):
    pcd = o3d.io.read_point_cloud(pcd_path)
    
    # Estimation normales requise
    pcd.estimate_normals()
    
    # Poisson Reconstruction
    mesh, densities = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(
        pcd, depth=depth
    )
    
    # Nettoyage des bulles (densités faibles)
    vertices_to_remove = densities < np.quantile(densities, 0.1)
    mesh.remove_vertices_by_mask(vertices_to_remove)
    
    return mesh

Le paramètre depth de l'Octree définit la résolution du mesh. Depth 8 est rapide, Depth 12 capture les détails fins (fissures) mais augmente exponentiellement le temps de calcul.

Synthèse : Quand utiliser la Photogrammétrie ?

Technologie Coût Matériel Précision Cas d'Usage
LiDAR Terrestre $$$$ (20k€+) Millimétrique Industrie, Métrologie
Photogrammétrie $ (Smartphone) Centimétrique Patrimoine, Visite Virtuelle, Asset 3D
LiDAR iPhone $$ (1k€) Décimétrique Scan rapide, Intérieur AR

📸 Devenez Expert en Reality Capture

Maîtrisez toute la chaîne, de la prise de vue par drone jusqu'au jumeau numérique, dans notre cursus "Reality Capture Specialist".

Rejoindre l'Elite (120h)