Я не уверен, правильно ли я понимаю. Но в отличие от вас, когда я получал справку, я использовал базовую векторную математику:
AB = AC - BC
A и B - маркеры, C - камера. поэтому, если я инвертирую ссылку tvec & rvec, добавлю к первым маркерам, я получу относительную точку. К этому я написал две функции:
def inversePerspective(rvec, tvec):
""" Applies perspective transform for given rvec and tvec. """
R, _ = cv2.Rodrigues(rvec)
R = np.matrix(R).T
invTvec = np.dot(R, np.matrix(-tvec))
invRvec, _ = cv2.Rodrigues(R)
return invRvec, invTvec
def relativePosition(rvec1, tvec1, rvec2, tvec2):
""" Get relative position for rvec2 & tvec2. Compose the returned rvec & tvec to use composeRT with rvec2 & tvec2 """
rvec1, tvec1 = rvec1.reshape((3, 1)), tvec1.reshape((3, 1))
rvec2, tvec2 = rvec2.reshape((3, 1)), tvec2.reshape((3, 1))
# Inverse the second marker, the right one in the image
invRvec, invTvec = inversePerspective(rvec2, tvec2)
info = cv2.composeRT(rvec1, tvec1, invRvec, invTvec)
composedRvec, composedTvec = info[0], info[1]
composedRvec = composedRvec.reshape((3, 1))
composedTvec = composedTvec.reshape((3, 1))
return composedRvec, composedTvec
Я в основном использовал для обозначения точки. Я использовал один из маркеров вращения в этом случае, но, возможно, он может помочь вам. Я действительно написал это в своем блоге, но это на турецком языке. Извините, я не успел написать по-английски:
Мой блог
А также вы можете увидеть мой исходный код для этого, я надеюсь, что он может помочь вам:
Мой исходный код.
Извините, если я неправильно понимаю вашу проблему там. Я не проверял свой код для точного определения угла, я проверял его на перевод.