python - openCV中的旋转矩阵

标签 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 使用逆转换?我想知道这是否是他们在文档中没有提及的内容,或者我是否以某种方式使用错误。

最佳答案

我认为问题在于,在传统的右手坐标系中,旋转矩阵看起来与您正在使用的完全一样。

而在图像中(OpenCV 处理图像)原点在左上角,x 轴向右(像往常一样),但 y 轴向下而不是而不是up,说明坐标系是左手系,旋转矩阵不同。

让我们在此坐标系中构建旋转矩阵。如果我们表示:

A - 线性变换(在我们的例子中是旋转)

然后我们得到

A(i) = (cos(角度), -sin(角度))

其中 i - 是对应于 x 轴的基向量

A(j) = (sin(angle), cos(angle))

其中 j- 是 y 轴的基本向量。

因此,旋转矩阵看起来与 OpenCV 中的完全一样:

A(i) 是它的第一列,

A(j) 是第二个。

关于python - openCV中的旋转矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28141559/

相关文章:

python - 如何通过数据库字段的数据更改 Django 模型的对象名称?

opencv - 如何使两张相机照片看起来相似(亮度、白平衡……)

opencv - OpenCv 中值数组的直方图

python - 有什么方法可以在 Python pandas 中获取标签编码器的映射?

python - 从子进程中实时捕获标准输出

python - 如何使用 keras 使 model.fit(...) 一次打印一个纪元?

opencv - 如何同步两个 USB 摄像头以将它们用作立体摄像头?

c# - 使用KnnMatch返回2张图像之间的相似度

c++ - 模板匹配与模板更新

php - 从 mysql 存储的图像创建缩略图