Skip to content

Exemple de résultat

caroline-iconem edited this page Oct 17, 2022 · 3 revisions

Objectif

Notre objectif dans cet exemple était de retrouver le lieu de prise de vue et les paramètres de caméra associés à une photo représentant un des bouddhas de Bamiyan, datant de 1930. Nous disposions pour cela d'un modèle 3D récent (2016) de la falaise et des bouddhas de Bamiyan.

Pré-requis

Définition des correspondances

Nous avons commencé par définir des points sur la photo, puis nous leur avons associé des points sur le modèle 3D :

Correspondances entre des points 3D (à gauche) et des points 2D (à droite). Une couleur = une correspondance.

Construction de la requête solveur

A partir de ces correspondances, nous avons construit la requête suivante (pour envoi vers le solveur) :

{
  "bindings": [
    {
      "point2D": {
        "x": 0.1002507811,
        "y": 0.14904092369
      },
      "point3D": {
        "x": 392723.6781258583,
        "y": 3854997.094100723,
        "z": 45.492522835731506
      }
    },
    {
      "point2D": {
        "x": -0.43119376845,
        "y": 0.22657162675
      },
      "point3D": {
        "x": 392653.87266898155,
        "y": 3855014.7516857386,
        "z": 53.69987381994724
      }
    },
    {
      "point2D": {
        "x": -0.07460277031,
        "y": -0.14440476017
      },
      "point3D": {
        "x": 392699.2864238918,
        "y": 3854987.753632784,
        "z": 16.72535276412964
      }
    },
    {
      "point2D": {
        "x": 0.07319435276,
        "y": -0.2798409932
      },
      "point3D": {
        "x": 392704.4091901779,
        "y": 3854933.417292595,
        "z": 4.7778849601745605
      }
    },
    {
      "point2D": {
        "x": -0.42492308295,
        "y": -0.00592180861
      },
      "point3D": {
        "x": 392655.6307860017,
        "y": 3855012.0965685844,
        "z": 30.91382074356079
      }
    },
    {
      "point2D": {
        "x": 0.38535136561,
        "y": 0.12865725451
      },
      "point3D": {
        "x": 392762.9967637658,
        "y": 3854993.1298668385,
        "z": 44.5735228061676
      }
    }
  ],
  "imageDimensions": {
    "width": 600,
    "height": 428
  }
}

Les coordonnées 3D correspondent aux coordonnées réelles des points (latitude, longitude, altitude), exprimées dans le système UTM42. Les coordonnées 2D correspondent au coordonnées des points dans l'image, normalisées pour être comprises entre $- \frac{1}{2}$ et $\frac{1}{2}$ (le coin inférieur gauche correspondant aux coordonnées $(- \frac{1}{2}, - \frac{1}{2})$ ).

Utilisation du solveur

Envoi de la requête avec Postman

La requête a été envoyée au solveur via l'application Postman. Avant d'envoyer la requête (bouton "Send"), nous avons configuré :

  • la méthode utilisée (POST)
  • l'adresse de la requête (localhost:3000/solve)
  • le format de la requête ("raw" et "JSON")
  • le contenu de la requête (cf plus haut)

Configuration de Postman.

Résultat

Le solveur nous a renvoyé, via Postman, la réponse suivante :

{
    "camera": {
        "matrix": [
            0.976617013897078,
            -0.2149810173742307,
            -0.0015395893917754672,
            0,
            -0.016300182807367003,
            -0.08118548359836542,
            0.9965657134847384,
            0,
            -0.2143677032745394,
            -0.973237935667142,
            -0.08279135444693941,
            0,
            392679.9855258583,
            3854832.634100723,
            3.872622835731505,
            1
        ],
        "cx": -0.0458218,
        "cy": -0.143115,
        "vFOV": 30.3807,
        "width": 600,
        "height": 428
    },
    "errorEstimation": {
        "bindingErrors": [
            {
                "x": 0.05079657177731339,
                "y": 0.07438563646462154
            },
            {
                "x": 0.22234668767704377,
                "y": 0.11339549914423908
            },
            {
                "x": 0.03899494425515092,
                "y": 0.07208558421813709
            },
            {
                "x": 0.03698063140863212,
                "y": 0.13994407410745394
            },
            {
                "x": 0.21924340607880055,
                "y": 0.003114572286527296
            },
            {
                "x": 0.19757015142504553,
                "y": 0.06435600231713988
            }
        ],
        "globalError": 0.10276781343000878
    }
}

Affichage du résultat

Simulation de la caméra

Dans notre modèle 3D, nous avons ensuite simulé la caméra avec les paramètres et le positionnement évalué par le solveur. On constate que la photo se superpose quasi-parfaitement sur le modèle 3D : l'estimation semble bonne.

Evaluation des paramètres de caméra et superposition 2D-3D

Erreurs de reprojection

Nous avons ensuite affiché les reprojections des points 3D, afin de les comparer aux points 2D initiaux (cf critère d'optimisation). On a ainsi pu constater que l'erreur de reprojection est très faible pour tous les points :

Erreurs de reprojection (le point initial est affiché en gros, le point reprojeté est affiché en petit)

Zoom sur des erreurs de reprojection (le point initial est affiché en gros, le point reprojeté est affiché en petit)

Remarque : On constate que plus les points sont éloignés du centre de l'image, plus les erreurs de reprojection sont importantes. Cela est dû au fait que nous n'avons pas modélisé de distorsion autre que le décalage du centre de la caméra (cf discussion sur la distorsion)