J'ai 4 points coplanaires dans une vidéo (ou une image) représentant un quadrilatère (pas nécessairement un carré ou un rectangle) et je voudrais pouvoir afficher un cube virtuel au-dessus d'eux où les coins du cube se trouvent exactement sur les coins du quadrilatère vidéo.
Puisque les points sont coplanaires, je peux calculer l'homographie entre les coins d'un carré unitaire (c'est-à-dire [0,0] [0,1] [1,0] [1,1]) et les coordonnées vidéo du carré.
À partir de cette homographie, je devrais pouvoir calculer une pose correcte de la caméra, c'est-à-dire [R|t] où R est une matrice de rotation 3x3 et t un vecteur de translation 3x1, de sorte que le cube virtuel se trouve sur le quadrant vidéo.
J'ai lu de nombreuses solutions (dont certaines sur SO) et j'ai essayé de les mettre en œuvre, mais elles ne semblent fonctionner que dans certains cas "simples" (comme lorsque le quad vidéo est un carré) mais ne fonctionnent pas dans la plupart des cas.
Voici les méthodes que j'ai essayées (la plupart d'entre elles sont basées sur les mêmes principes, seuls les calculs de la translation sont légèrement différents). Soit K la matrice intrinsèque de la caméra et H l'homographie. On calcule :
A = K-1 * H
Soit a1,a2,a3 les vecteurs colonnes de A et r1,r2,r3 les vecteurs colonnes de la matrice de rotation R.
r1 = a1 / ||a1||
r2 = a2 / ||a2||
r3 = r1 x r2
t = a3 / sqrt(||a1||*||a2||)
Le problème est que cela ne fonctionne pas dans la plupart des cas. Afin de vérifier mes résultats, j'ai comparé R et t avec ceux obtenus par la méthode solvePnP d'OpenCV (en utilisant les points 3D suivants [0,0,0] [0,1,0] [1,0,0] [1,1,0]).
Comme j'affiche le cube de la même manière, j'ai remarqué que dans tous les cas solvePnP fournit des résultats corrects, alors que la pose obtenue à partir de l'homographie est la plupart du temps fausse.
En théorie, puisque mes points sont coplanaires, il est possible de calculer la pose à partir d'une homographie, mais je n'ai pas trouvé la manière correcte de calculer la pose à partir de H.
Avez-vous une idée de ce que je fais mal ?
Modifier après avoir essayé la méthode de @Jav_Rock
Salut Jav_Rock, merci beaucoup pour votre réponse, j'ai essayé votre approche (et beaucoup d'autres aussi) qui semble être plus ou moins OK. Néanmoins, j'ai encore quelques problèmes lorsque je calcule la pose sur la base de 4 points coplanaires. Afin de vérifier les résultats, je les compare avec ceux de solvePnP (qui seront bien meilleurs grâce à l'approche itérative de minimisation des erreurs de reprojection).
Voici un exemple :
- Cube jaune : Résoudre PNP
- Black Cube : La technique de Jav_Rock
- Cube(s) cyan (et violet) : quelques autres techniques donnant exactement les mêmes résultats
Comme vous pouvez le voir, le cube noir est plus ou moins OK mais ne semble pas bien proportionné, bien que les vecteurs semblent orthonormés.
EDIT2 : J'ai normalisé v3 après l'avoir calculé (afin d'appliquer l'orthonormalité) et cela semble résoudre certains problèmes également.
3 votes
Donc le solvepnp d'opencv fournit des résultats corrects alors que votre implémentation est fausse ?
2 votes
Oui, solvePnP donne des résultats corrects alors que mon implémentation utilisant uniquement les homographies ne donne pas de vecteurs de rotation/translation corrects.
1 votes
Si vous partagez votre code, nous pouvons le parcourir et voir comment le corriger. Une chose que vous avez peut-être oublié est d'imposer l'orthonormalité de la matrice de rotation.
1 votes
Je crois que vous avez toutes les étapes nécessaires : 1.-Obtenir les données intrinsèques de la caméra 2.-Définir les correspondances à 4 points et calculer H avec DLT 3.-Multiplier H par K.inv() 4.-Décomposer le résultat comme expliqué par @Jav_Rock
0 votes
J'ai essayé les deux méthodes mais j'obtiens toujours des résultats erronés. Avec solvePnP, au moins certaines parties de ma projection ont un sens. Pouvez-vous s'il vous plaît jeter un coup d'œil à ma question pour y répondre ? stackoverflow.com/a/29078048/663551
0 votes
Quelqu'un pourrait-il m'aider à résoudre ma dernière question ? C'est quelque chose de similaire à cette question, mais je ne suis pas vraiment sûr de savoir comment je dois utiliser la solution fournie ci-dessous. Comment appeler
cameraPoseFromHomography
? Quel est le paramètre H et quel est le paramètre de pose ? Comment dessiner un cube comme dans l'image des questions ? S'il te plaît, aide-moi car je ne sais pas comment continuer ! Salutations- Jonas (Vous pouvez trouver la question ici : stackoverflow.com/questions/51009968/how-to-draw-cube-c )