我想在OpenCV和Python中使用透視扭曲糾正圖像。我知道攝像機的方向(X,Y,Z角度)參照需要變形的平面。我知道最簡單的方法是基於已知點計算單應性矩陣,但是我試圖在信息不可用時做同樣的事情。我正在使用的代碼創建一個旋轉矩陣,然後結合平移矩陣和本徵矩陣。目前代碼僅適用於z軸的操作。任何對x軸和y軸的操縱都會導致圖像奇怪的失真。我將我的代碼放在以下帖子底部的答案上:Perspective Warping in OpenCV based on know camera orientation問題與透視單應
附加的是原始圖像和來自標準單應性法的變形圖像。
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")
謝謝錘子。在Z軸上移動圖像效果不錯,但調整焦距效果更好。 – eminentCodfish