Как я могу найти угол между двумя плоскостями шахматной доски? - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть две позы на шахматной доске, полученные с помощью 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 в конце?

1 Ответ

0 голосов
/ 27 сентября 2018

Я нашел, как переводить точки между системами координат в этой OpenCV Demo .

Объяснение из "Демо 3: Гомография со смещением камеры" (раздел охватывает титры справа допервые строки кода) показывает, как переводить между системами координат с использованием умножения матриц.Мне просто пришлось применить это к моей ситуации (у меня было C M O1 и C M O2 , и мне нужно было найти O1 M O2 ).

Таким образом, я могу получить две плоскости с одинаковыми координатами.система, получить их нормали и найти угол между ними.

Также это помогло понять, что внешняя матрица [RT] переводит трехмерную точку из мировой координаты.Система координат камеры.система (где камера в (0,0,0)), а не наоборот.

...