Wenn ich renne:
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()
Ich bekomme:
[[6.92798859e-310]
[2.19380404e-316]
[1.58101007e-322]]
[[0.]
[0.]
[0.]]
Also das Ergebnis von changes()
Änderungen.
Ich verstehe nicht, warum das so ist, und die Tatsache, dass es sich nicht mehr ändert, wenn die tvec=np.zeros(3)
Zeile auskommentiert wird, lässt mich das Gefühl haben, dass dies ein Fehler im System ist.
np.zeros(3)
in zwei verschiedenen Variablen speichere . Wenn ich das Ergebnis nicht speichere oder dieselbe Variable nicht zweimal verwende, wird dies nicht der Fall sein. Vielleicht kann jemand mit mehr numpy Wissen etwas Licht ins Dunkel bringen.Antworten:
Dies ist sehr wahrscheinlich ein nicht initialisiertes Array, wie es von zurückgegeben wird
np.empty
. Dies kann zusammen mit dem Speicherrecycling zu dem Effekt führen, den Sie sehen. Ein minimales Beispiel wäre:Beobachten Sie, wie bei der ersten Iteration
y
Müll und bei jeder nachfolgenden Iteration der Wert der vorherigen Iteration enthalten ist,x
da ihr der zuvor freigegebene Speicher zugewiesen wurde.Wir können leicht überprüfen, ob im ursprünglichen Beispiel auch das vorherige
tvec
auftaucht:Wir können weiter spekulieren, dass es die eigentümliche Wahl ist
rmat
, die den Fehler auslöst.Es ist wahrscheinlich ein Fehler, der überhaupt
eye(4)
akzeptiert wird, weil offiziellrmat
3x1 1x3 oder 3x3 sein sollte. In der Tat wird eine 1Drmat
ohne 3 Elemente vom Python-Wrapper korrekt abgelehnt. Mein Verdacht ist, dass 2D-Regeln auf Python-Ebene nicht richtig überprüft werden. Der C-Code erkennt dann, dass die falsche Form nichts anderes tut, als einen Fehlercode zurückzugeben, auf den der Python-Code nicht prüft.In
rmat=eye(3)
der Tat verschwindet die Verwendung eines Effekts:quelle
np.empty
dieses Verhalten bekannt ist, weil es Speicher nimmt Bytes , wie sie kommen, ohne vorhandene Werte zu aktualisieren. Diecv2.Rodrigues
Funktion soll jedoch nach strenger Berechnung einige aussagekräftige Werte zurückgeben. Darüber hinaus können die im OP dargestellten seltsamen Werte kaum als Müll betrachtet werden, da sie alle sehr nahe bei Null liegen.Auf jeden Fall ist es ein Fehler in der Rodrigues-Funktion ...
Wenn Sie das entsprechende Dokument lesen , sehen Sie möglicherweise, dass
cv2.Rodrigues
es zwei verschiedene Schnittstellen hat:Eine, die die C ++ - Schnittstelle nachahmt, bei der der Rotationsvektor (und optional der Jacobi) als Referenz übergeben und von der Funktion geändert werden
und eine (mehr Pythonic), bei der der Rotationsvektor und der Jacobi als Tupel zurückgegeben werden
Wenn Sie die erste Schnittstelle verwenden, verschwindet die pb ...
Ergebnis:
BEARBEITEN nach weiterer Untersuchung:
Die Funktion ist erwartungsgemäß noch fehlerhafter : Bei Verwendung der ersten Schnittstelle werden die Parameter
dst
undjacobian
nicht geändert, was in völligem Widerspruch zur Dokumentzeichenfolge steht:Mit anderen Worten, dies erfordert eindeutig einen Fehlerbericht ...
quelle
np.eye(4)
. Das Verfahren erfordert einen Rotationsvektor (3x1 oder 1x3) oder eine Rotationsmatrix (3x3). Hier mit np.eye (4) erstellt die Funktion dst mit einer gewissen Größe. Da die Eingabeform jedoch falsch ist, führt die Methode nichts aus und lässt sie einheitlich. Außerdem verweisen Sie auf eine veraltete Version von OpenCV. Es ist besser, die Master-Version zu verwenden oder auf eine bestimmte Version zu verweisen: siehe docs.opencv.org .