Il s'agit très probablement d'un tableau non initialisé tel que renvoyé par np.empty. Ceci, combiné au recyclage de la mémoire, peut conduire au type d'effet que vous voyez. Un exemple minimal serait:
for a in range(5):
y = np.empty(3,int)
x = (np.arange(3)+a)**3
print(x,y)
del x
# [0 1 8] [94838139529536 0 0]
# [ 1 8 27] [0 1 8]
# [ 8 27 64] [ 1 8 27]
# [ 27 64 125] [ 8 27 64]
# [ 64 125 216] [ 27 64 125]
Observez comment, à la première itération, ycontient des ordures et à chaque itération suivante, il contient la valeur de la précédente, xcar sa mémoire qui a été libérée juste avant lui est attribuée.
Nous pouvons facilement vérifier que dans l'exemple d'origine, c'est également le précédent tvecqui apparaît:
def changes():
rmat=np.eye(4)
tvec=np.array([4,0.0,2.5])
(rvec, jacobian)=cv2.Rodrigues(rmat)
print(rvec)
for i in range(3):
changes()
# [[4.6609787e-310]
# [0.0000000e+000]
# [0.0000000e+000]]
# [[4. ]
# [0. ]
# [2.5]]
# [[4. ]
# [0. ]
# [2.5]]
Nous pouvons en outre spéculer que c'est le choix particulier rmatqui déclenche l'erreur.
C'est probablement un bogue qui eye(4)est accepté du tout parce que, officiellement, rmatdevrait être 3x1 1x3 ou 3x3. En effet, un 1D rmatqui n'a pas 3 éléments est correctement rejeté par le wrapper Python. Je soupçonne que les «mat» 2D ne sont pas correctement vérifiés au niveau Python. Le code C détecte alors la mauvaise forme ne fait rien, sauf pour renvoyer un code d'erreur que le code Python ne vérifie pas.
En effet, utiliser un rmat=eye(3)effet disparaît:
def changes():
rmat=np.eye(3)
tvec=np.array([4,0.0,2.5])
(rvec, jacobian)=cv2.Rodrigues(rmat)
print(rvec)
for a in range(3):
changes()
# [[0.]
# [0.]
# [0.]]
# [[0.]
# [0.]
# [0.]]
# [[0.]
# [0.]
# [0.]]