openCV中的旋转矩阵
rotation matrix in openCV
我正在 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 使用逆转换?我想知道这是否是他们在文档中没有提到的内容,或者我是否以某种方式使用错误。
我认为问题在于,在传统的右手坐标系中,旋转矩阵看起来与您使用的完全一样。
而在图像中(并且 OpenCV
适用于图像)原点位于左上角,x 轴向右移动(像往常一样),但 y 轴向下而不是up,表示坐标系为左手系,旋转矩阵不同
让我们在这个坐标系中构建旋转矩阵。如果我们表示:
A
- 线性变换(在我们的例子中是旋转)
然后我们得到
A(i) = (cos(angle), -sin(angle))
其中i
- 是x轴对应的基向量
A(j) = (sin(angle), cos(angle))
其中 j
- 是 y 轴的基本矢量。
因此,旋转矩阵看起来与 OpenCV
完全一样:
A(i)
是它的第一列,
A(j)
是第二个
我正在 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 使用逆转换?我想知道这是否是他们在文档中没有提到的内容,或者我是否以某种方式使用错误。
我认为问题在于,在传统的右手坐标系中,旋转矩阵看起来与您使用的完全一样。
而在图像中(并且 OpenCV
适用于图像)原点位于左上角,x 轴向右移动(像往常一样),但 y 轴向下而不是up,表示坐标系为左手系,旋转矩阵不同
让我们在这个坐标系中构建旋转矩阵。如果我们表示:
A
- 线性变换(在我们的例子中是旋转)
然后我们得到
A(i) = (cos(angle), -sin(angle))
其中i
- 是x轴对应的基向量
A(j) = (sin(angle), cos(angle))
其中 j
- 是 y 轴的基本矢量。
因此,旋转矩阵看起来与 OpenCV
完全一样:
A(i)
是它的第一列,
A(j)
是第二个