我有一张名为I1的图片,不是我拍摄的,而是从Google下载得来。
我使用已知的单应性矩阵h对I1进行变换,得到以下图像I2。
我假设有一台相机拍摄了I2的上方图像。我已经找到了这个“相机”的相机矩阵。让这个相机矩阵为k
。现在,我想围绕相机轴旋转这个图像I2。根据这个问题中被接受的答案中的解释,我需要设置旋转矩阵R,然后对图像I1执行k*R*inv(k)*h
以获得所需的旋转图像I3。当我尝试设置旋转矩阵R时,我遇到了问题。我使用这种方法来设置矩阵R。
为了测试我的代码,我最初尝试将图像沿z轴旋转10度,但我没有得到正确的输出。
我的部分Python代码:
theta_in_degrees = 10
theta_in_radians = theta_in_degrees*math.pi/180
ux=0.0
uy=0.0
uz=1.0
vector_normalize_factor = math.sqrt(ux*ux+uy*uy+uz*uz)
ux=ux/vector_normalize_factor
uy=uy/vector_normalize_factor
uz=uz/vector_normalize_factor
print "ux*ux+uy*uy+uz*uz = ", ux*ux+uy*uy+uz*uz
rotation_matrix = np.zeros([3,3])
c1 = math.cos(theta_in_radians)
c2 = 1-c1
s1 = math.sin(theta_in_radians)
rotation_matrix[0][0] = c1+ux*ux*c2
rotation_matrix[0][1] = ux*uy*c2-uz*s1
rotation_matrix[0][2] = ux*uz*c2+uy*s1
rotation_matrix[1][0] = uy*ux*c2+uz*s1
rotation_matrix[1][1] = c1+uy*uy*c2
rotation_matrix[1][2] = uy*uz*c2-ux*s1
rotation_matrix[2][0] = uz*ux*c2-uy*s1
rotation_matrix[2][1] = uz*uy*c2+ux*s1
rotation_matrix[2][2] = c1+uz*uz*c2
print "rotation_matrix = ", rotation_matrix
R = rotation_matrix
#Calculate homography H1 between reference top view and rotated frame
k_inv = np.linalg.inv(k)
Hi = k.dot(R)
Hii = k_inv.dot(h)
H1 = Hi.dot(Hii)
print "H1 = ", H1
im_out = cv2.warpPerspective(im_src, H1, (im_dst.shape[1],im_dst.shape[0]))
这里,img_src
是I1的源。
当我尝试上述代码时,得到的结果是一张黑色的图片,没有任何部分可见。然而,当我将theta_in_degrees
的值更改为以下值时,这些是我的输出:
0.00003
0.00006
0.00009
为什么旋转只对如此小的theta_in_degrees值起作用?另外,图像中可见的旋转实际上并没有围绕z轴发生。为什么图像不围绕z轴旋转?我做错了什么,如何解决这些问题?h矩阵:
[[ 1.71025842e+00 -7.51761942e-01 1.02803446e+02]
[ -2.98552735e-16 1.39232576e-01 1.62792482e+02]
[ -1.13518150e-18 -2.27094753e-03 1.00000000e+00]]
k矩阵:
[[ 1.41009391e+09 0.00000000e+00 5.14000000e+02]
[ 0.00000000e+00 1.78412347e+02 1.17000000e+02]
[ 0.00000000e+00 0.00000000e+00 1.00000000e+00]]
编辑:
在采纳Toby Collins的建议后,我将k
的左上角值设置为与k[1][1]
相同。现在,当我绕z轴旋转时,对于theta_in_degrees
从0到360的所有值,我都能得到正确的旋转图像。然而,当我尝试通过将上述代码中的ux、uy和uz更改为以下内容来绕y轴旋转图像时,结果却荒谬无比:
ux=0.0
uy=1.0
uz=0.0
下面展示了不同 theta_in_degrees
值的示例以及绕 y 轴旋转的相应结果:
-10
-40
-90
-110
我还有哪些地方做错了?此外,为什么旋转图像中连续的黄色条纹的长度和宽度会大幅下降?而且为什么图像的一部分会环绕(例如,通过-90度和-110度的旋转结果)?
我的第二个问题是:我的旋转轴的向量方程是(320, 0, -10)+t(0, 1, 0)
。为了使用这种方法计算旋转矩阵,我需要定义旋转轴的ux
、uy
和uz
,使得ux^2+uy^2+uz^2=1
。如果旋转需要围绕其中一个坐标轴进行(就像我目前正在为测试目的而做的那样),那么这将是直接的。但是,如果我的旋转轴的向量方程中的t
是可变的,我该如何获取这些ux
、uy
和uz
的值呢?如果要围绕我提到的轴(比如说,以x度)进行旋转,我也愿意听取关于寻找适当的旋转矩阵R的任何其他方法的建议。
H'
。这个单应矩阵H'
将把原始图像I1
映射到旋转后的最终图像I3
。我假设我们通过将I2
沿着相机轴旋转x
度来获得I3
。所有这些都符合这个问题 - https://dev59.com/jFYN5IYBdhLWcg3wFksL. - RaviTej310