Трехмерное вращение изображения

Я пытаюсь получить код, который будет выполнять перспективное преобразование (в данном случае трехмерное вращение) изображения.

import os.path
import numpy as np
import cv

def rotation(angle, axis):
    return np.eye(3) + np.sin(angle) * skew(axis) \
               + (1 - np.cos(angle)) * skew(axis).dot(skew(axis))

def skew(vec):
    return np.array([[0, -vec[2], vec[1]],
                     [vec[2], 0, -vec[0]],
                     [-vec[1], vec[0], 0]])

def rotate_image(imgname_in, angle, axis, imgname_out=None):
    if imgname_out is None:
        base, ext = os.path.splitext(imgname_in)
        imgname_out = base + '-out' + ext
    img_in = cv.LoadImage(imgname_in)
    img_size = cv.GetSize(img_in)
    img_out = cv.CreateImage(img_size, img_in.depth, img_in.nChannels)
    transform = rotation(angle, axis)
    cv.WarpPerspective(img_in, img_out, cv.fromarray(transform))
    cv.SaveImage(imgname_out, img_out)

Когда я вращаюсь вокруг оси z, все работает, как ожидалось, но вращение вокруг оси x или y кажется совершенно невозможным. Мне нужно повернуться на такой маленький угол, как пи / 200, прежде чем я начну получать результаты, которые кажутся хоть сколько-нибудь разумными. Есть идеи, что может быть не так?

8
задан Alceu Costa 8 February 2012 в 11:37
поделиться