J'essaye de rectifier une image en utilisant une chaîne de perspective dans OpenCV et Python. Je connais l'orientation de la caméra (angles X, Y, Z) en référence au plan à déformer. Je sais que la méthode la plus simple consiste à calculer une matrice d'homographie basée sur des points connus, mais j'essaie de faire la même chose lorsque cette information n'est pas disponible. Le code avec lequel je travaille crée une matrice de rotation puis combine les matrices translationnelles et intrinsèques. Actuellement, le code ne fonctionne qu'avec des manipulations sur l'axe z. Toute manipulation des axes x et y entraîne une distorsion bizarre de l'image. Je base mon code sur la réponse au bas du message suivant: Perspective Warping in OpenCV based on know camera orientationProblèmes avec une homographie de perspective
Ci-joint est l'image originale et une image déformée de la méthode d'homographie standard.
from numpy import *
import cv
x = float(0)
y = float(5)
z = float(0)
f = 1
im = cv.LoadImage("Homography_test.jpg")
cv.NamedWindow("Distorted")
cv.NamedWindow("undistorted")
h, w = cv.GetSize(im)
x1 = x * (pi/180)
y1 = y * (pi/180)
z1 = z * (pi/180)
# Create a rotation matrix
R_array = array([[x1], [y1], [z1]])
R_Vec = cv.fromarray(R_array)
R = cv.CreateMat(3, 3, cv.CV_64FC1)
cv.Rodrigues2(R_Vec, R)
#Create and combine with translation matrix
Trans_Mat = array([[[1], [0], [-w/2]],
[[0], [1], [-h/2]],
[[0], [0], [1]]])
Trans_Mat2 = cv.fromarray(Trans_Mat)
R_T_Mat = dot(R, Trans_Mat2)
#Create and combine with camera matrix
Intrinsic_Mat = array([[[f], [0], [w/2]],
[[0], [f], [h/2]],
[[0], [0], [1]]])
Int_Mat = cv.fromarray(Intrinsic_Mat)
H = dot(Int_Mat, R_T_Mat)
H2 = cv.fromarray(H)
persp = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_8U, 3)
cv.WarpPerspective(im, persp, H2)
cv.ShowImage("Distorted", im)
cv.ShowImage("undistorted", persp)
cv.WaitKey(0)
cv.DestroyWindow("Distorted")
cv.DestroyWindow("undistorted")
Merci marteau. Le déplacement de l'image sur l'axe Z a fonctionné un peu, mais le réglage de la distance focale a mieux fonctionné. – eminentCodfish