Si je cours:
import numpy as np
import cv2
def changes():
rmat=np.eye(4)
tvec=np.zeros(3)
(rvec, jacobian)=cv2.Rodrigues(rmat)
print rvec
for i in range(2):
changes()
Je reçois:
[[6.92798859e-310]
[2.19380404e-316]
[1.58101007e-322]]
[[0.]
[0.]
[0.]]
Donc, le résultat des changes()
changements.
Je ne comprends pas pourquoi cela, et le fait qu'il cesse de changer si la tvec=np.zeros(3)
ligne est commentée, me fait penser que c'est un bogue dans le système.
np.zeros(3)
dans deux variables différentes . Si je ne stocke pas le résultat ou n'utilise pas la même variable deux fois, ce ne sera pas le cas. Peut-être que quelqu'un avec une connaissance plus engourdie peut nous éclairer à ce sujet.Réponses:
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: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: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 1Drmat
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:la source
np.empty
ce comportement est bien connu, car il prend des octets de mémoire au fur et à mesure, sans mettre à jour les valeurs existantes. Mais lacv2.Rodrigues
fonction est censée retourner des valeurs significatives, après un calcul rigoureux. De plus, les valeurs étranges présentées dans le PO peuvent difficilement être considérées comme des ordures, car elles sont toutes très proches de zéro.C'est définitivement un bug dans la fonction Rodrigues ...
Si vous lisez le document correspondant , vous pouvez voir qu'il
cv2.Rodrigues
a 2 interfaces différentes:celui qui imite l'interface C ++, où le vecteur de rotation (et éventuellement le jacobien) sont passés par référence et modifiés par la fonction
et un (plus Pythonic) où le vecteur de rotation et le jacobien sont retournés comme un tuple
Si vous utilisez la première interface, le pb disparaît ...
Résultat:
EDIT après enquête supplémentaire:
La fonction est encore plus boguée comme prévu: lors de l'utilisation de la première interface, les paramètres
dst
etjacobian
ne sont pas modifiés, ce qui est en totale contraction avec la docstring:En d'autres termes, cela nécessite clairement un rapport de bug ...
la source
np.eye(4)
. La méthode nécessite un vecteur de rotation (3x1 ou 1x3) ou une matrice de rotation (3x3). Ici, avec np.eye (4), la fonction crée dst avec une certaine taille. Mais comme la forme d'entrée est erronée, la méthode ne fait rien et la laisse unialisée. En outre, vous pointez vers une version obsolète d'OpenCV. Il est préférable d'utiliser la version principale ou de pointer vers une version spécifique: voir docs.opencv.org .