我正在开发一个项目,旨在基于已知的相机方位角移除图片的透视畸变。我的想法是可以创建一个基于相机已知的X、Y和Z方向的旋转矩阵。然后通过WarpPerspective方法将这些矩阵应用于图像上。
在我的Python脚本中,我创建了三个旋转矩阵,每个基于一个方向角度。我遇到了两个问题。首先,在将每个单独的矩阵加载到WarpPerspective方法中时,它似乎不能正确地工作。每当我在一个轴上扭曲图像时,图像会显着超出扭曲。只有当我将方位角限制在大约1度或更低时,图像内容才能被识别出来。
其次,如何将这三个旋转矩阵合并成一个要加载到WarpPerspective方法中的矩阵。我可以将一个3x3旋转矩阵导入该方法中吗?还是必须创建一个4x4投影矩阵?下面是我正在处理的代码。
感谢您的帮助。
CR
在我的Python脚本中,我创建了三个旋转矩阵,每个基于一个方向角度。我遇到了两个问题。首先,在将每个单独的矩阵加载到WarpPerspective方法中时,它似乎不能正确地工作。每当我在一个轴上扭曲图像时,图像会显着超出扭曲。只有当我将方位角限制在大约1度或更低时,图像内容才能被识别出来。
其次,如何将这三个旋转矩阵合并成一个要加载到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")
camera_mat
中,我假设第一行或第二行中的image.cols
是指图像的列数?可能只适用于正方形图像。 - oarfish