Le calcul de la caméra pose avec homographie matrice basée sur 4 points coplanaires

J'ai 4 points coplanaires dans une vidéo (ou l'image), soit un quad (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 reposent exactement sur les coins de la vidéo quad.

Depuis les points sont coplanaires je peux calculer l'homographie entre les coins d'un carré (c'est à dire [0,0] [0,1] [1,0] [1,1]) la vidéo et les coordonnées de la quad.

De cette homographie je devrais être capable de calculer une bonne caméra pose, c'est à dire [R|t] où R est un 3x3 matrice de rotation et t est un 3x1 le vecteur de translation, de sorte que le cube virtuel se trouve sur la vidéo quad.

J'ai lu beaucoup de solutions de (sur) et essayé de les mettre en œuvre, mais elles semblent de ne travailler que dans certains cas "simples", (comme lorsque la vidéo quad est un carré), mais ne fonctionne pas dans la plupart des cas.

Ici sont les méthodes que j'ai essayé (la plupart d'entre eux sont basés sur le même principe, seul le calcul de la traduction sont légèrement différents). Soit K l'intrinsèques de la matrice de la caméra et H de l'homographie. Nous calculons:

A = K-1 * H

Laisser a1,a2,a3 être 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é la R et t avec ceux obtenus par OpenCV est solvePnP méthode (à l'aide de la suite de points 3D [0,0,0] [0,1,0] [1,0,0] [1,1,0]).

Depuis que je l'affichage du cube de la même façon, j'ai remarqué que dans tous les cas solvePnP fournit des résultats corrects, tandis que la pose obtenu à partir de l'homographie est le plus souvent fausses.

En théorie, puisque mes points sont coplanaires, il est possible de calculer la pose d'une homographie, mais je ne pouvais pas trouver la bonne façon de calculer la pose de H.

Des idées sur ce que je fais de mal?

Modifier après avoir essayé @Jav_Rock la méthode de

Hi Jav_Rock, merci beaucoup pour votre réponse, j'ai essayé votre approche (et beaucoup d'autres) qui semble être plus ou moins OK.
Néanmoins j'ai encore arriver à avoir quelques problèmes lors du calcul de la pose sur la base de 4 coplanaires point. Afin de vérifier les résultats que j'ai comparer avec les résultats de la solvePnP (qui sera beaucoup mieux en raison de l'itératif erreur de reprojection à la minimisation de l'approche).

Voici un exemple:

Le calcul de la caméra pose avec homographie matrice basée sur 4 points coplanaires

  • Cube jaune: Résoudre PNP
  • Cube noir: Jav_Rock la technique de
  • Cyan (et Violet) cube(s): quelques autres techniques étant donné 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 repère orthonormé.

EDIT2: je normalisé v3 après l'informatique (afin de faire respecter orthonormality) et il semble que pour résoudre certains problèmes.

  • Donc opencv est solvepnp fournit des résultats corrects lorsque votre application est mal ?
  • Oui solvePnP donne des résultats corrects alors que mon implémentation à l'aide d'homographies seulement ne donne de rotation correct/traduction des vecteurs.
  • Si vous partagez votre code, nous pouvons aller à travers elle et de voir comment il peut être résolu. Une chose que vous pourriez avoir oublié de faire respecter orthonormality de la matrice de rotation.
  • Je crois que vous avez toutes les étapes que vous devez: 1.-Obtenir intrinsèques de la caméra 2.-Définir 4-point de correspondances et de calculer H avec DLT 3.-De gauche se multiplient H avec K. inv() 4.-Décomposer le résultat, comme expliqué par @Jav_Rock
  • J'ai essayé les deux méthodes, mais j'ai tout le temps d'obtenir de mauvais résultats. Avec solvePnP au moins certaines parties de ma projection manke de sens. Pouvez vous s'il vous plaît jetez un oeil à ma question, pour la fourniture d'une réponse? stackoverflow.com/a/29078048/663551
  • Hey. Quelqu'un voudrait-il m'aider à résoudre ma dernière question? C'est quelque chose de semblable à cette question, mais je ne suis pas vraiment sûr de savoir comment je dois utiliser la solution fournie ci-dessous. Comment appeler cameraPoseFromHomography? Ce paramètre est H et de ce paramètre est la pose? Comment dessiner un cube comme dans les questions de l'image? Merci de m'aider parce que je suis un ignorant, comment aller de l'avant! Salutations - Jonas (Vous pouvez trouver la question ici: stackoverflow.com/questions/51009968/how-to-draw-cube-c)

InformationsquelleAutor JimN | 2012-01-19