# Photogrammétrie Python : L'Art de la Reconstruction 3D

> Tutoriel complet sur la reconstruction 3D à partir de photos (Photogrammétrie) avec Python et COLMAP. Automatisez le pipeline Structure-from-Motion.

- Adresse : https://fr.learngeodata.eu/blog/reconstruction-3d-photos-python
- Rubrique : Articles techniques
- Langue : fr
- Auteur : Dr. Florent Poux (https://fr.learngeodata.eu/formateur/florent-poux)
- Éditeur : 3D Geodata Academy (organisme de formation, France)
- Index du site pour les assistants : https://fr.learngeodata.eu/llms.txt
- Publié le 2025-12-02

---
## 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.

La triangulation, qui est tout le principe de la photogrammétrie. Un même détail est reconnu sur deux images ; comme la position et l'orientation de chaque prise de vue sont connues, les deux rayons se croisent en un seul point de l'espace. Répétée sur des centaines de milliers de détails, l'opération produit le nuage.

## 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.

```
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.

## 4. Post-Traitement et Maillage

Une fois le nuage dense obtenu, nous utilisons **Poisson Surface Reconstruction** pour créer un maillage (Mesh) étanche.

```
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".

[Le programme et les tarifs →](https://fr.learngeodata.eu/tarifs)
