2 votes

Est-il possible d'utiliser solvePnP pour trouver la position réelle de 4 points d'angle ?

Je peux utiliser le solvepnp pour trouver la rotation et la translation de (0,0,0) du cadre de la came et du cadre du monde.

mtx = np.array([
[463.889   ,       0       ,    320],
[0         ,       463.889,     240],
[0         ,       0   ,         1 ],
])
dist = np.array([0.0,0,0,0,0])

objp = np.zeros((4,3), np.float32)
objp[:,:2] = np.mgrid[0:2,0:2].T.reshape(-1,2)

#objp = array([[ 0.,  0.,  0.], 
#   [ 1.,  0.,  0.],
#   [ 0.,  1.,  0.],
#   [ 1.,  1.,  0.]], dtype=float32)
# let assume the square len is 1cm.

corners2 = np.float32([ [[498,136]] , [[558,138]],  [[505,184]], [[569,186]]])
retval, rvecs, tvecs = cv2.solvePnP(objp, corners2, mtx, dist)

imgpts, jac = cv2.projectPoints(axis, rvecs, tvecs, mtx, dist)

Est-ce que tvecs correspond à la position de (0,0,0) de l'image de la caméra ?

Comment puis-je aussi trouver les translations des 3 autres points ? ([ 1., 0., 0.], [ 0., 1., 0.], [ 1., 1., 0.])

en d'autres termes, puis-je obtenir la position réelle de tous les points de corners2 ?

3voto

api55 Points 6048

Est-ce que tvecs correspond à la position de (0,0,0) de l'image de la caméra ?

Vous pouvez trouver la réponse à cette question dans la documentation d'OpenCV.

  • rvec - Vecteur de rotation de sortie (voir Rodrigues() ) qui, avec tvec , fait passer les points du système de coordonnées du modèle au système de coordonnées de l'ordinateur. système de coordonnées de la caméra.
  • tvec - Vecteur de traduction de sortie.

Ici, il vous dit qu'il amène les points du système de coordonnées du modèle vers celui de la caméra, ce qui signifie que quel que soit le système de coordonnées de vos points, il trouvera la translation et la rotation nécessaires pour les déplacer vers une position qui peut être projetée sur un plan image et produire l'image 2D.

Pour votre question, cela dépend... si vous supposez que vos points proviennent d'une caméra qui les regarde et les génère avec la caméra comme origine (0,0,0) alors oui. Si l'origine est au milieu de vos points et que par caméra vous entendez celle qui génère l'image où vous obtenez vos points 2D, alors ce tvecs est l'origine vers cette caméra.

Comment puis-je aussi trouver les translations des 3 autres points ? ([ 1., 0., 0.], [ 0., 1., 0.], [ 1., 1., 0.])

Assez facile, d'abord vous devez créer une matrice de transformation à partir des rvecs et tvecs. rvecs est dans Rodrigues et vous pouvez utiliser cette fonction pour obtenir la matrice de rotation (3x3) et vous mettez la translation comme vecteur colonne à côté et en dessous une ligne de 0 et 1 dans la position las comme ceci :

                 R11 R12 R13 T1

Transformation = R21 R22 R23 T2

                 R31 R32 R33 T3

                 0   0   0   1

Maintenant, vous mettez les points en coordonnées homogènes (essentiellement un 1 sous dans une ligne supplémentaire. Puis vous multipliez le tout.

P = 1
    0
    0
    1

Transformation * P

Vous pouvez le faire avec tous les points que vous voulez :) Dans ce cas, cela vous donnera un vecteur 4x1 qui représente votre point 3D et la dernière partie (dans ce cas) sera 1 et peut être enlevée pour revenir à un point 3D. Dans d'autres cas, la dernière composante divise les autres composantes (pour la rendre 1) et elle est également supprimée.

Pour finir, vous pouvez également obtenir la pose de la caméra avec ce faire en continu ; elle peut être suivie.

J'espère que cela vous aidera.

0voto

manhon Points 259

C'est donc comme ça ? Merci beaucoup.

rotMat,_ = cv2.Rodrigues(rvecs)
T0 = np.zeros((4, 4))
T0[:3,:3] = rotMat
T0[:4,3] = [0, 0, 0, 1]
T0[:3,3] =  np.transpose(tvecs)

p0 = np.array([0, 0, 0, 1])
z0 = np.dot(T0, p0);

p1 = np.array([0, 1, 0, 1])
z1 = np.dot(T0, p1);

p2 = np.array([1, 0, 0, 1])
z2 = np.dot(T0, p2);

p3 = np.array([1, 1, 0, 1])
z3 = np.dot(T0, p3);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X