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:
- 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)
Vous devez vous connecter pour publier un commentaire.
Si vous avez votre Homographie, vous pouvez calculer la caméra pose avec quelque chose comme ceci:
Cette méthode fonctionne formulaire de moi. Bonne chance.
cameraPoseFromHomography
? Puis-je calculer le cube sans rien savoir de plus que les 4 coins du rectangle? Toute aide serait très appréciée. SalutationsLa réponse proposée par Jav_Rock ne fournit pas une solution valable pour la pose de la caméra dans l'espace à trois dimensions.
Pour l'estimation de l'arbre dimensions de rotation et de transformation induite par une homographie, il existe de multiples approches. L'un d'eux fournit fermé formules pour la décomposition de l'homographie, mais ils sont très complexes. Aussi, les solutions ne sont jamais uniques.
Heureusement, OpenCV 3 implémente déjà cette décomposition (decomposeHomographyMat). Etant donnée une homographie et une bonne échelle intrinsèques de la matrice, la fonction fournit un ensemble de quatre rotations et des translations.
Juste au cas où les gens ont besoin de python pour le portage de la fonction écrit par @Jav_Rock:
Fonctionne très bien dans mes tâches.
Informatique [R|T] à partir de la matrice d'homographie est un peu plus compliqué que Jav_Rock de réponse.
Dans OpenCV 3.0, il existe une méthode appelée cv::decomposeHomographyMat qui revient quatre solutions possibles, l'un d'eux est correct. Cependant, OpenCV ne pas fournir une méthode pour choisir le bon.
Je suis en train de travailler sur le présent et peut-être vais poster mes codes d'ici la fin du mois.
Avion qui contiennent votre Place sur l'image a une fuite lane agents de votre appareil photo.
L'équation de cette droite est Unx+By+C=0.
Normal de votre avion (A,B,C)!
Laissez-p00,p01,p10,p11 sont les coordonnées du point après l'application de l'appareil photo paramètres intrinsèques et de forme homogène e.g, p00=(x00,y00,1)
Ligne de fuite peut être calculé comme:
Où croix dans la norme du vecteur de la croix-produit
Voici une version de python, basé sur celui présenté par Dmitriy poète-peintre voloshin qui normalise la matrice de rotation et transpose le résultat à 3x4.