如何找到两个棋盘平面之间的角度?

How can I find the angle between two chessboard planes?

我有两个棋盘姿势 solvePnp:

Mat rotationVector1, translationVector1;
solvePnP(chess1WorldPoints, chess1ImagePoints, intrinsicMatrix, distortCoefficients, rotationVector1, translationVector1);

Mat rotationVector2, translationVector2;
solvePnP(chess2WorldPoints, chess2ImagePoints, intrinsicMatrix, distortCoefficients, rotationVector2, translationVector2);

如何检查姿势的平面是否平行,或找到这些平面之间的角度?

更多信息

我尝试获取欧拉角并计算每个 alpha、beta 和 gamma 之间的差异,但这只告诉我每个轴的相对旋转,我认为:

Vec3d eulerAnglesPose1; 
Mat rotationMatrix1;
Rodrigues(rotationVector1, rotationMatrix1);
getEulerAngles(rotationMatrix1, eulerAngles1);

Vec3d eulerAnglesPose2;
Mat rotationMatrix2;
Rodrigues(rotationVector2, rotationMatrix2);
getEulerAngles(rotationMatrix2, eulerAngles2);

我使用了 getEulerAngles 实现:

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 到相机系统应该像 in this post:

Rinv = R' (just the transpose as it's a rotation matrix)
Tinv = -Rinv * T (T is 3x1 column vector)

那么如果 Pw = [X Y Z] 是世界坐标中的一个点。系统 2 我可以得到它的相机系统 coords.with:

Pc = [ Rinv Tinv] * [X Y Z 1] transposed.
Pc looks like [a b c d]

再次按照同样的逻辑我可以得到Pc相对于coord的坐标。系统 1:

Pw1 = [ R1 T1] * Pc

最后我应该标准化 Pc 还是只标准化 Pw1?

我在这个 OpenCV Demo 中找到了如何在坐标系之间转换点。

来自 "Demo 3: Homography from the camera displacement" 的解释(从标题右侧到第一行代码的部分)展示了如何使用矩阵乘法在坐标系之间进行转换。我只需要将它应用到我的情况(我有 CMO1CMO2 需要找到 O1MO2).

这样我就可以在同一个坐标系中得到两架飞机。系统,获取它们的法线并找到它们之间的角度。

它还有助于认识到外部矩阵 [R T] 从世界坐标转换 3D 点。系统到相机坐标。系统(相机位于(0,0,0)),而不是相反。