openCV中的旋转矩阵

时间:2015-01-25 21:11:03

标签: python opencv image-processing transformation scikit-image

我在python中创建一个旋转矩阵,如下所示:

import numpy as np
def make_rot(angle):
    cost = np.cos(np.deg2rad(angle))
    sint = np.sin(np.deg2rad(angle))
    rot = np.array([[cost, -sint, 0],
                   [sint, cost, 0],
                   [0, 0, 1]])
    return rot

这是维基百科页面中定义的:http://en.wikipedia.org/wiki/Rotation_matrix

我使用角度参数运行它为45度,我得到类似的东西:

[[ 0.70710678 -0.70710678  0.        ]
 [ 0.70710678  0.70710678  0.        ]
 [ 0.          0.          1.        ]]

现在,我使用OpenCV getRotationMatrix2D API,如下所示:

import cv2
M = cv2.getRotationMatrix2D((0, 0), 45, 1)

我得到的矩阵是矩阵的逆矩阵(转置因为它是一个旋转矩阵)。结果如下:

[[ 0.70710678  0.70710678  0.        ]
 [-0.70710678  0.70710678  0.        ]]

正如你所看到的那样是相反的。我在OpenCV文档中没有找到任何关于此行为的内容。

现在,我可以在OpenCV和skimage中使用此矩阵来转换图像,如下所示:

# openCV
M = cv2.getRotationMatrix2D((0, 0), 45, 1)
dst = cv2.warpAffine(image2, M, (coumns, rows))

# skimage
from skimage import transform as tf
tform = tf.AffineTransform(matrix=make_rot(45))
dst = tf.warp(image_2, tform)

令人惊讶的是,使用我的矩阵和OpenCV矩阵的结果是相同的。

我的问题是为什么OpenCV使用转换的逆转?我想知道这是否是他们在文档中没有提到的东西,或者我是否以某种方式使用了这个错误。

1 个答案:

答案 0 :(得分:1)

我认为问题在于,在传统的右手坐标系中,旋转矩阵看起来与您使用的矩阵完全相同。在图片中(OpenCV使用图片),原点在左上角,x轴向右(通常),但是y轴向下而不是向上,这意味着坐标系是左手和旋转矩阵是不同的。 让我们在这个坐标系中建立旋转矩阵。如果我们表示A-线性变换(在本例中为旋转),则得到A(i)=(cos(angle),-sin(angle)),其中i-是与x轴对应的基本矢量; A(j)=(sin(angle),cos(angle)),其中j-是y轴的基本向量。因此,旋转矩阵的外观与OpenCV完全相同:A(i)是其第一列,A(j)n是第二列。