了解opencv的decomposeHomographyMat输出

时间:2018-04-27 23:11:05

标签: python python-2.7 opencv opencv3.0 homography

我试图找到移动相机所需的角度,使其直接位于物体前方。如果我的相机从左边看30度角的物体,那么我的脚本应该返回30度。我使用cv2.decomposeHomographyMat来找到一个工作正常的旋转矩阵。这个函数返回了4个解,所以在我的脚本中输出4个角度。在这些角度中,只有两个独特的角度。我的问题是我不知道这两个角度中的哪一个是正确的。

我知道decomposeHomographyMat会返回四种可能的解决方案,但角度是否应该相同?我还发现我的点的坐标投影在2D平面上,但我不知道如何处理这些信息以找到哪个角度是正确的(这里pts3D是从相机拍摄的物体的2D点)为z列添加0的图像使其成为3D点):

for i in range(len(Ts)):
    projectedPts = cv2.projectPoints(pts3D, Rs[i], Ts[i], CAM_MATRIX, DIST_COEFFS)[0][:,0,:]

以下是我的代码中的代码段。也许我错误地确定旋转矩阵的角度?在下面的示例中,y1和y2将是相同的角度,y3和y4将是相同的角度。有人可以帮助解释我如何确定哪个角度是正确的角度,以及为什么有两个不同的角度返回?

def rotationMatrixToEulerAngles(R):
    sy = math.sqrt(Rs[0][0] * R[0][0] +  R[1][0] * R[1][0])
    singular = sy < 1e-6

    if  not singular :
        x = math.atan2(R[2][1] , R[2][2])
        y = math.atan2(-R[2][0], sy)
        z = math.atan2(R[1][0], R[0][0])
    else :
        x = math.atan2(-R[1][2], R[1][1])
        y = math.atan2(-R[2][0], sy)
        z = 0
    return np.rad2deg(y)



H, status = cv2.findHomography(corners, REFPOINTS)

output = cv2.warpPerspective(frame, H, (800,800))

# Rs returns 4 matricies, we use the first one
_, Rs, Ts, Ns = cv2.decomposeHomographyMat(H, CAM_MATRIX)


y1 = rotationMatrixToEulerAngles(Rs[0])
y2 = rotationMatrixToEulerAngles(Rs[1])
y3 = rotationMatrixToEulerAngles(Rs[2])
y4 = rotationMatrixToEulerAngles(Rs[3])

谢谢!

0 个答案:

没有答案