J'utilise le code OpenCV suivant pour estimer la pose d'un marqueur carré et dessiner les 3 axis du marqueur sur l'image. Mais l'axe Z du marqueur tourne de 180 degrés de temps en temps comme le montre l'image ci-dessous. Comment rendre l'axe z stable?Erreur dans l'estimation de la position du marqueur à l'aide d'une seule caméra
// Marker world coordinates
vector<Point3f> objecPoints;
objecPoints.push_back(Point3f(0, 0, 0));
objecPoints.push_back(Point3f(0, 2.4, 0));
objecPoints.push_back(Point3f(2.4, 2.4, 0));
objecPoints.push_back(Point3f(2.4, 0.0, 0));
// 2D image coordinates of 4 marker corners. They are arranged in the same order for each frame
vector<Point2f> marker2DPoints;
// Calculate Rotation and Translation
cv::Mat Rvec;
cv::Mat_<float> Tvec;
cv::Mat raux, taux;
cv::solvePnP(objecPoints, marker2DPoints, camMatrix, distCoeff, raux, taux);
// Draw marker pose on the image
vector<Point3f> axisPoints3D;
axisPoints3D.push_back(Point3f(0, 0, 0));
axisPoints3D.push_back(Point3f(2.4, 0, 0));
axisPoints3D.push_back(Point3f(0, 2.4, 0));
axisPoints3D.push_back(Point3f(0, 0, 2.4));
vector<Point2f> axisPoints2D;
// Take the camMatrix and distCoeff from camera calibration results
projectPoints(axisPoints3D, Rvec, Tvec, camMatrix, distCoeff, axisPoints2D);
line(srcImg, axisPoints2D[0], axisPoints2D[1], CV_RGB(0, 0, 255), 1, CV_AA);
line(srcImg, axisPoints2D[0], axisPoints2D[2], CV_RGB(0, 255, 0), 1, CV_AA);
line(srcImg, axisPoints2D[0], axisPoints2D[3], CV_RGB(255, 0, 0), 1, CV_AA);
Il me semble que le marqueur de droite (ID 4) est symétrique (si vous l'avez retourné sur un axe, il serait toujours enregistrer comme le même marqueur Aruco). Si c'est le cas, il semble que l'orientation de l'étiquette soit ambiguë. Est-ce que cela n'arrive que pour l'ID 4? (L'ID 3 n'est pas symétrique, je me demande si vous pouvez changer l'ID 4 pour une étiquette non symétrique similaire). –