Sto cercando di ottenere del codice che eseguirà una trasformazione prospettica (in questo caso una rotazione 3d) su un'immagine.rotazione 3D sull'immagine
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)
Quando ruotare attorno all'asse z, tutto funziona come previsto, ma ruotando attorno all'asse xoy sembra completamente fuori. Ho bisogno di ruotare di angoli piccoli come il pi/200 prima di iniziare a ottenere risultati che sembrano del tutto ragionevoli. Qualche idea di cosa potrebbe essere sbagliato?