2017-04-09 7 views
1

Je suis nouveau chez opencv et Aruco. J'ai essayé de trouver les différences d'angles d'axes de deux marqueurs Aruco différents. Par exemple, la différence d'angle b/w les deux (1, 0, 0) vecteurs de marqueurs dans le monde réel. À ma connaissance, la transformation se produit dans l'ordre suivant: coordonnée locale -> coordonnées de la caméra -> coordonnées du monde. Et puis j'obtiens la différence d'angle de deux marqueurs aruco parce qu'ils sont maintenant tous les deux dans la même coordonnée du monde. Quelqu'un peut-il expliquer comment ce processus est fait? Ou y a-t-il une meilleure façon de trouver la différence d'angle? Je suis avec le codage python et OpenCVComment obtenir la différence de l'axe-ange Aruco Markers dans le monde coordonnée?

connu:

  1. Traduction et vecteurs rotation (1x3) de la fonction estimatePoseSingleMarkers() dans aruco module. (Les vecteurs de rotation et de translation peuvent être transformés en matrice (3x3) avec Rodrigues())
  2. matrice de caméra (3x3) et matrice dist_coefs (1x5) de l'étalonnage de la caméra.
  3. utilisant 6x6_250 marqueurs aruco

Upate:

    monde
  1. coordonnées = coordonnée caméra
  2. Ce qui suit est la fonction pour dessiner les composants XYZ du aruco. On dirait que l'origine ou la caméra est (0, 0, 0). Appliquer la matrice de traduction et de rotation du marqueur aruco aux composantes d'origine x, y, z me procure les composantes x, y, z du marqueur aruco. Est-ce correct?

/** */

void drawAxis(InputOutputArray _image, InputArray _cameraMatrix, InputArray _distCoeffs, 
      InputArray _rvec, InputArray _tvec, float length) { 

CV_Assert(_image.getMat().total() != 0 && 
      (_image.getMat().channels() == 1 || _image.getMat().channels() == 3)); 
CV_Assert(length > 0); 

// project axis points 
vector<Point3f> axisPoints; 
axisPoints.push_back(Point3f(0, 0, 0)); 
axisPoints.push_back(Point3f(length, 0, 0)); 
axisPoints.push_back(Point3f(0, length, 0)); 
axisPoints.push_back(Point3f(0, 0, length)); 
vector<Point2f> imagePoints; 
projectPoints(axisPoints, _rvec, _tvec, _cameraMatrix, _distCoeffs, imagePoints); 

// draw axis lines 
line(_image, imagePoints[0], imagePoints[1], Scalar(0, 0, 255), 3); 
line(_image, imagePoints[0], imagePoints[2], Scalar(0, 255, 0), 3); 
line(_image, imagePoints[0], imagePoints[3], Scalar(255, 0, 0), 3); 

}

Répondre

0

Techniquement, il est un travail autour de ma question. J'ai donc pensé que la bibliothèque ARUCO a cette fonction appelée projectPoints qui mappe les objectPoints 3D en 2D imagePoints. ImagePoints [0] et points d'image [1] vous donne la projection 2D de (longueur, 0, 0). En utilisant arccos (np.dot (v1, v2)), vous pouvez obtenir la différence dans l'angle de l'axe des x des deux marqueurs.