Я использую маркеры aruco, чтобы определить местоположение робота. После получения позы с помощью эстимейта PoseSingleMarkers я получаю rvecs и tvecs для данного маркера. Из этого, как я мог получить повернутый угол маркера вокруг каждой оси.
я использовал код ниже, чтобы обнаружить и нарисовать маркеры aruco вместе с его осью
while(true)
{
vector< vector<Point2f>> corners; //All the Marker corners
vector<int> ids;
cap >> frame;
cvtColor(frame, gray, CV_BGR2GRAY);
aruco::detectMarkers(gray, dictionary, corners, ids);
aruco::drawDetectedMarkers(frame,corners,ids);
aruco::estimatePoseSingleMarkers(corners, arucoMarkerLength, cameraMatrix, distanceCoefficients, rvecs, tvecs);
for(int i = 0; i < ids.size(); i++)
{
aruco::drawAxis(frame, cameraMatrix, distanceCoefficients, rvecs[i], tvecs[i], 0.1f);
}
imshow("Markers", frame);
int key = waitKey(10);
if((char)key == 'q')
break;
}
Вращение маркера относительно камеры было получено, сначала взяв матрицу вращения из вектора вращения (rvec), а затем взяв угол Эйлера.
Преобразование матрицы вращения в углы Евлера приведено здесь
Других решений пока нет …