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, y
contient des ordures et à chaque itération suivante, il contient la valeur de la précédente, x
car 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 tvec
qui 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 rmat
qui déclenche l'erreur.
C'est probablement un bogue qui eye(4)
est accepté du tout parce que, officiellement, rmat
devrait être 3x1 1x3 ou 3x3. En effet, un 1D rmat
qui 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.]]