如何从findHomography中获取旋转角度?

3

我想要旋转图像,但不想使用 cv2.warpPerspective() 函数。如何从 cv2.findHomography() 函数的输出中获取角度?

这篇文章并没有帮助到我

# Find homography
H, mask = cv2.findHomography(points1, points2, cv2.RANSAC)

# for example my H:
array([[ 1.20001976e-01,  5.19205433e-04, -1.21739638e+01],
       [ 1.51272694e-03,  1.18686196e-01, -1.59772594e+01],
       [ 1.98308723e-06, -1.18197608e-07,  1.00000000e+00]])

# What should be the someFunction function?
angle = someFunction(H) # from 0 to 360

rotated = imutils.rotate(image, angle=angle)

openCV已经有一个decomposeHomographyMat方法来完成这个任务。 - EdChum
@EdChum,那么如何从现有数据中获取“K-输入内部相机校准矩阵”? - dodo shurygin
也许可以使用 getAffine https://docs.opencv.org/4.1.1/da/d54/group__imgproc__transform.html#ga8f6d378f9f8eebb5cb55cd3ae295a999,然后使用 getRTfromHomogeneous https://docs.opencv.org/4.1.1/dd/d76/classcv_1_1detail_1_1AffineWarper.html#ac54ef5b572ef0727c0b8e324d584b393。 - fmw42
1个回答

2

如果两组点之间的变换是缩放+旋转+平移,则单应矩阵将简单地成为仿射矩阵,其中2x2左上角块是缩放旋转。在这种情况下,使用以下公式计算角度:

angle = math.atan2(H[1,0], H[0,0])

如果可能出现其他类型的变换(剪切,投影),最好先对2x2左上角块执行SVD分解以恢复旋转:

u, _, vh = numpy.linalg.svd(H[0:2, 0:2])
R = u @ vh
angle = math.atan2(R[1,0], R[0,0])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接