확실히, 그것은 Rodrigues 기능의 버그입니다 ...
해당 doc 을 읽으면 cv2.Rodrigues
두 가지 다른 인터페이스가 있음을 알 수 있습니다.
C ++ 인터페이스를 모방 한 것으로, 회전 벡터 (및 선택적으로 jacobian)가 참조로 전달되고 함수에 의해 수정됩니다.
cv2.Rodrigues(src, dst[, jacobian]) --> None
회전 벡터와 자 코비안이 튜플로 반환되는 하나 (더 Pythonic)
cv2.Rodrigues(src) --> dst, jacobian
첫 번째 인터페이스를 사용하면 pb가 사라집니다.
import numpy as np
import cv2
def changes():
rmat=np.eye(4)
tvec=np.zeros(3)
#(rvec, jacobian)=cv2.Rodrigues(rmat)
cv2.Rodrigues(rmat, tvec)
print(tvec)
for i in range(2):
changes()
결과:
[0. 0. 0.]
[0. 0. 0.]
추가 조사 후 편집 :
함수는 예상대로 더 버그가 있습니다. 첫 번째 인터페이스를 사용할 때 매개 변수 dst
와 jacobian
수정되지 않습니다. 이는 docstring과 완전히 모순됩니다.
>>> help(cv2.Rodrigues)
Help on built-in function Rodrigues:
Rodrigues(...)
Rodrigues(src[, dst[, jacobian]]) -> dst, jacobian
. @brief Converts a rotation matrix to a rotation vector or vice versa.
.
. @param src Input rotation vector (3x1 or 1x3) or rotation matrix (3x3).
. @param dst Output rotation matrix (3x3) or rotation vector (3x1 or 1x3), respectively.
. @param jacobian Optional output Jacobian matrix, 3x9 or 9x3, which is a matrix of partial
. derivatives of the output array components with respect to the input array components.
즉, 분명히 버그 보고서가 필요합니다 ...