Я создаю матрицу вращения в 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 работает с обратным преобразованием? Мне интересно, это то, что они не упоминают в документации, или я как-то использую это неправильно.
skimage.transform.SimilarityTransform(angle=X)
или простоskimage.transform.rotate(angle=X, resize=False)
- person user2970139   schedule 27.01.2015