【问题标题】:rotation matrix in openCVopenCV中的旋转矩阵
【发布时间】: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


【解决方案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) 是第二个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2013-01-27
    • 1970-01-01
    • 2012-09-09
    相关资源
    最近更新 更多