カメラの既知の向きに基づいて画像から遠近歪みを除去しようとするプロジェクトに取り組んでいます。私の考えでは、カメラの既知の X、Y、および Z 方向に基づいて回転行列を作成できます。次に、これらの行列を WarpPerspective メソッドを介して画像に適用できます。
私のスクリプト (Python で記述) では、3 つの回転行列を作成し、それぞれが方向角に基づいています。私は 2 つの問題で行き詰まるところまで来ました。まず、個々のマトリックスを WarpPerspective メソッドにロードすると、正しく機能していないように見えます。画像を 1 つの軸でワープするたびに、画像が大幅にオーバーワープされているように見えます。画像の内容は、向きの角度を約 1 度以下に制限した場合にのみ認識できます。
次に、3 つの回転マトリックスを単一のマトリックスに結合して、WarpPerspective メソッドにロードする方法を教えてください。そのメソッドに 3x3 回転行列をインポートできますか、それとも 4x4 射影行列を作成する必要がありますか? 以下は私が取り組んでいるコードです。
ご協力ありがとうございました。
CR
from numpy import *
import cv
#Sets angle of camera and converts to radians
x = -14 * (pi/180)
y = 20 * (pi/180)
z = 15 * (pi/180)
#Creates the Rotational Matrices
rX = array([[1, 0, 0], [0, cos(x), -sin(x)], [0, sin(x), cos(x)]])
rY = array([[cos(y), 0, -sin(y)], [0, 1, 0], [sin(y), 0, cos(y)]])
rZ = array([[cos(z), sin(z), 0], [-sin(z), cos(z), 0], [0, 0, 1]])
#Converts to CVMat format
X = cv.fromarray(rX)
Y = cv.fromarray(rY)
Z = cv.fromarray(rZ)
#Imports image file and creates destination filespace
im = cv.LoadImage("reference_image.jpg")
dst = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_8U, 3)
#Warps Image
cv.WarpPerspective(im, dst, X)
#Display
cv.NamedWindow("distorted")
cv.ShowImage("distorted", im)
cv.NamedWindow("corrected")
cv.ShowImage("corrected", dst)
cv.WaitKey(0)
cv.DestroyWindow("distorted")
cv.DestroyWindow("corrected")