`cv2.getRotationMatrix2D` 返回的地图矩阵

Map Matrix Returned by `cv2.getRotationMatrix2D`

我正在查看返回的 map_matrix(即矩阵运算符) 函数 cv2.getRotationMatrix2D。据我计算,自 运算符围绕任意点旋转图像并缩放 矩阵,运算符可以计算为(-x,-y)的平移, 然后是旋转,然后是 (+x,+y) 的平移,然后 像这样乘以标量 k

其中 C = cos(theta)S = sin(theta)。 (参见 旋转矩阵和 围绕一个旋转 点)。 这接近于 OpenCV 在其文档中列出的内容,但不是 完全一样(你可以看到 k/scale 没有乘以 整个 (1-C) 项和 beta 的符号被翻转:

我知道旋转矩阵是斜对称的,因为如果 theta是负数,那么由于正弦是奇函数,我们 会有

在上面,但我们仍然不会得到与所示相同的结果 OpenCV。我错过了什么吗?我在推导的某个地方搞砸了吗? OpenCV 是如何得出他们的等式的?

有人检查我这个...

  1. 我忘了我们使用的是非标准坐标。如上所示的旋转矩阵用于笛卡尔坐标,其中 y 点 "upward"。然而,在计算机图形学中,y 轴从左上角指向下方。 (请参阅此维基百科 link [旋转矩阵][1] 上的 "Non-standard orientation of the coordinate system" 部分。)

因此,要使逆时针旋转为正,我们需要在旋转矩阵中输入-theta

  1. 如果我们交换上面的kT(x,y),并且k替换为它的齐次坐标表示,我们会得到正确的等式。即,上面我有 kI,其中 I 是单位矩阵。相反,我应该使用这个

齐次坐标在计算机图形学中是必需的,因为我们正在对 2D 点进行变换,但需要将运算表示为 3x3 矩阵才能使数学工作。

最后,从最终结果中删除不必要的 [0 0 1] 行,你就得到了 OpenCV 所拥有的。 (您将 2x3 矩阵乘以 3x1 点向量(即 [x y 1].T;记住齐次坐标)以获得 2x1 输出。