首页 > 解决方案 > 了解 opencv 的 decomposeHomographyMat 输出

问题描述

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

我知道 decomposeHomographyMat 返回四种可能的解决方案,但角度不应该相同吗?我还找到了投影在 2D 平面上的点的坐标,但我不确定如何处理这些信息以找到正确的角度(这里 pts3D 是从相机图像中获取的对象的 2D 点)为 z 列添加了 0,使其成为 3D pts):

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])

谢谢!

标签: pythonpython-2.7opencvopencv3.0homography

解决方案


推荐阅读