我在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使用转换的逆转?我想知道这是否是他们在文档中没有提到的东西,或者我是否以某种方式使用了这个错误。
答案 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是第二列。