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:
- 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())
- matrice de caméra (3x3) et matrice dist_coefs (1x5) de l'étalonnage de la caméra.
- utilisant 6x6_250 marqueurs aruco
Upate:
-
monde
- coordonnées = coordonnée caméra
- 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);
}