У меня есть две позы на шахматной доске, полученные с помощью solvePnp
:
Mat rotationVector1, translationVector1;
solvePnP(chess1WorldPoints, chess1ImagePoints, intrinsicMatrix, distortCoefficients, rotationVector1, translationVector1);
Mat rotationVector2, translationVector2;
solvePnP(chess2WorldPoints, chess2ImagePoints, intrinsicMatrix, distortCoefficients, rotationVector2, translationVector2);
Как проверить, параллельны ли плоскости поз, или найти угол между этими плоскостями?
Подробнее
Я пытался получить углы Эйлера и вычислить разницу между каждой альфой, бета и гаммой, но это говорит только об относительном вращении для каждой оси, я думаю:
Vec3d eulerAnglesPose1;
Mat rotationMatrix1;
Rodrigues(rotationVector1, rotationMatrix1);
getEulerAngles(rotationMatrix1, eulerAngles1);
Vec3d eulerAnglesPose2;
Mat rotationMatrix2;
Rodrigues(rotationVector2, rotationMatrix2);
getEulerAngles(rotationMatrix2, eulerAngles2);
Я использовал реализацию getEulerAngles
из Поворот камеры SolvePnp :
void getEulerAngles(Mat &rotCamerMatrix, Vec3d &eulerAngles)
{
Mat cameraMatrix, rotMatrix, transVect, rotMatrixX, rotMatrixY, rotMatrixZ;
double* _r = rotCamerMatrix.ptr<double>();
double projMatrix[12] =
{
_r[0],_r[1],_r[2],0,
_r[3],_r[4],_r[5],0,
_r[6],_r[7],_r[8],0
};
decomposeProjectionMatrix(Mat(3, 4, CV_64FC1, projMatrix), cameraMatrix, rotMatrix, transVect, rotMatrixX, rotMatrixY, rotMatrixZ, eulerAngles);
}
Редактировать
В моем случае пара вращение-перевод(R, T) дает соответствие между системой координат, где камера находится в точке (0,0,0) (система координат камеры), системе координат, где (0,0,0) - это то, что я определил в первых двухпараметры solvePnp (мировая система координат).Таким образом, у меня есть две мировые системы координат относительно одной и той же системы координат камеры.Если бы я мог переключиться с координации.Система 2 по согласованию.Система 1 Я мог бы использовать плоскости Z = 0 для каждой, чтобы найти нормали и решить мою проблему.
Я думаю, что например переключение с координаты.Система 2 для камеры Система должна быть сделана как в этом посте :
Rinv = R' (just the transpose as it's a rotation matrix)
Tinv = -Rinv * T (T is 3x1 column vector)
Тогда, если Pw = [XYZ] - точка в мировой координате.система 2 Я могу получить ее систему координат камеры.
Pc = [ Rinv Tinv] * [X Y Z 1] transposed.
Pc looks like [a b c d]
Следуя той же логике, я могу получить координаты Pc относительно координаты.система 1:
Pw1 = [ R1 T1] * Pc
Должен ли я нормализовать Pc или просто нормализовать Pw1 в конце?