Понимание результатов opencv - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь найти угол, необходимый для перемещения камеры, чтобы она находилась прямо перед объектом. Если моя камера смотрит на объект под углом 30 градусов слева, то мой сценарий должен вернуть 30 градусов. Я использую cv2.decomposeHomographyMat, чтобы найти матрицу вращения, которая работает нормально. Из этой функции возвращено 4 решения, поэтому в моем сценарии я вывожу 4 угла. Из этих углов есть только два уникальных угла. Моя проблема в том, что я не знаю, какой из этих двух углов правильный.

Я знаю, что degposeMomographyMat возвращает четыре возможных решения, но не должны ли углы быть одинаковыми? Я также нашел координаты моих точек, спроецированных на 2D-плоскость, но я не был уверен, что делать с этой информацией в отношении определения правильного угла (здесь pts3D - это 2D-точки объекта, взятые из изображения с камеры с помощью добавлено 0 для столбца z, делающего его трехмерным (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])

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...