2013-01-17 3 views
2

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.

Original ImagePerspective Warp

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") 

Répondre

1

vous semblent pas manquer 4 de ma solution était « déplacer l'image vers le bas de l'axe z » la ligne que je l'habitude de le faire était.

//4 
trans(2,2) += image.rows; 

J'ai choisi image.rows arbitrairement, il a donné un bon sens de l'échelle à la rotation I utilisé dans l'exemple. Puisque vous ne faites pas que votre coordonnée z est fixée à 1. J'imagine que c'est la cause de la distorsion quand vous tournez autour de x et y, essentiellement parce que l'image est si proche de la caméra quand elle tourne autour de x ou la distorsion de perspective est massive. Plus la translation est importante sur l'axe z, plus la distorsion doit être petite. Si vous ne voulez pas que l'image diminue au fur et à mesure que l'axe z descend, augmentez simplement votre distance focale. Vous remarquerez peut-être dans mon exemple que j'ai défini ma focale à image.rows.

+0

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

Questions connexes