2016-12-12 4 views
1

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); 

Pose estimation results at time t Pose estimation results at time t+1

+0

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). –

Répondre

0

Ce serait probablement mieux comme commentaire, mais je ne l'ai pas assez réputation pour cela. Je pense que cela peut se produire en raison de l'ordre dans lequel solvePnP obtient les coordonnées de votre tag. En outre, puisque solvePnP essaie juste de faire correspondre (dans ce cas) 4 points sur un plan 3D à 4 points 2D dans une image, il existe plusieurs solutions pour cela. L'étiquette pourrait être tournée autour de son axe haut, et retournée à l'envers. solvePnP ne sait pas à partir des points fournis qui est la direction vers le haut. J'ai l'intuition que solvePnP est un peu trop général pour ce problème car un algorithme stable de détection d'étiquette devrait être capable d'alimenter les coins au code d'estimation de pose dans un ordre stable.

Éditer: l'ordre des coins est important et la solution donnée par solvePnP en dépend. Peut-être que l'algorithme générant vos points d'angle ne fournit pas les coins dans un ordre cohérent? S'il vous plaît partager la sortie de tags.points

+0

J'ai trouvé ceci dans la [source du dernier OpenCV] (https://github.com/opencv/opencv_contrib/blob/master/modules/aruco/src/aruco.cpp#L843) où en interne ils utilisent également solvePnP pour Estimer la pose d'une nouvelle étiquette appelée ArUco. – allsey87

+0

Quatre coins des marqueurs sont déjà commandés correctement et cohérents pour tous les cadres. Les points d'angle sont marqués avec des points de couleur différente (vert, bleu, noir et cyan) et ils sont cohérents comme indiqué dans les images du haut et du bas. – Udaya