【发布时间】:2015-03-24 08:39:19
【问题描述】:
我在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 doc说它使用[cos sin; -sin cos] 用于 ccw 旋转,但我不确定这是否正确。只需通过翘曲或乘点尝试是cw还是ccw; )
-
请注意维基百科的这一部分:“本文中的示例适用于通过预乘法在右手坐标系中逆时针主动旋转向量。如果其中任何一个发生更改(例如旋转轴而不是向量,即被动变换),则应使用示例矩阵的逆矩阵,这与其转置精确一致。”因此,sci-kit 和 openCV 中的图像来源(例如左上角或左下角)可能不同?
-
一定是这个。我会调查的。
-
因此,skimage 扭曲函数需要逆变换(从输出图像到输入图像)。我不确定为什么会这样。这对于仿射变换来说不是问题,因为它们是双射的。但是,使用输入坐标->输出坐标进行转换更好。
-
为了防止在输出图像中留下空洞,逆变换应该是更好的选择。
标签: python opencv image-processing transformation scikit-image