Jika saya menjalankan:
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()
Saya mendapat:
[[6.92798859e-310]
[2.19380404e-316]
[1.58101007e-322]]
[[0.]
[0.]
[0.]]
Jadi hasil dari changes()
perubahan.
Saya tidak mengerti mengapa itu, dan fakta bahwa itu berhenti berubah jika tvec=np.zeros(3)
garis dikomentari, membuat saya merasa bahwa ini adalah bug dalam sistem.
np.zeros(3)
dalam dua variabel yang berbeda . Jika saya tidak menyimpan hasilnya atau menggunakan variabel yang sama dua kali, itu tidak akan. Mungkin seseorang dengan pengetahuan lebih numpy dapat menjelaskan ini.Jawaban:
Kemungkinan besar ini adalah array yang belum diinisialisasi seperti yang dikembalikan oleh
np.empty
. Ini bersama dengan daur ulang memori dapat menyebabkan jenis efek yang Anda lihat. Contoh minimal adalah:Amati bagaimana pada iterasi pertama
y
berisi sampah dan pada setiap iterasi berikutnya ia berisi nilai sebelumnyax
karena diberi memori yang telah dibebaskan sebelumnya.Kita dapat dengan mudah memeriksa bahwa dalam contoh asli juga yang sebelumnya
tvec
muncul:Kami lebih lanjut berspekulasi bahwa itu adalah pilihan aneh
rmat
yang memicu kesalahan.Mungkin bug yang
eye(4)
diterima sama sekali karena, secara resmi,rmat
harus 3x1 1x3 atau 3x3. Memang, 1Drmat
yang tidak memiliki 3 Elemen ditolak dengan benar oleh pembungkus Python. Kecurigaan saya adalah bahwa 2D ´rmat`s tidak diperiksa dengan benar di tingkat Python. Kode C kemudian mendeteksi bentuk yang salah tidak melakukan apa pun kecuali mengembalikan kode kesalahan yang tidak diperiksa oleh kode Python.Memang menggunakan
rmat=eye(3)
efeknya hilang:sumber
np.empty
perilaku ini dikenal, karena dibutuhkan byte memori saat mereka datang, tanpa memperbarui nilai yang ada. Tetapicv2.Rodrigues
fungsi ini seharusnya mengembalikan beberapa nilai yang berarti, setelah perhitungan yang ketat. Selain itu, nilai-nilai aneh yang disajikan dalam OP hampir tidak dapat dianggap sebagai sampah, karena semuanya hampir nol.Jelas, ini adalah bug dalam fungsi Rodrigues ...
Jika Anda membaca dokumen terkait , Anda mungkin melihat bahwa
cv2.Rodrigues
memiliki 2 antarmuka berbeda:yang meniru antarmuka C ++, di mana vektor rotasi (dan opsional oleh jacobian) dilewatkan dengan referensi dan dimodifikasi oleh fungsi
dan satu (lebih Pythonic) di mana vektor rotasi dan jacobian dikembalikan sebagai tupel
Jika Anda menggunakan antarmuka pertama, pb menghilang ...
Hasil:
EDIT setelah penyelidikan lebih lanjut:
Fungsi ini bahkan lebih buggy seperti yang diharapkan: ketika menggunakan antarmuka pertama, parameter
dst
danjacobian
tidak dimodifikasi, yang merupakan kontras total dengan docstring:Dengan kata lain, ini jelas membutuhkan laporan bug ...
sumber
np.eye(4)
. Metode ini membutuhkan vektor rotasi (3x1 atau 1x3) atau (3x3) matriks rotasi. Di sini dengan np.eye (4) fungsi menciptakan dst dengan beberapa ukuran. Tetapi karena bentuk input salah, metode tidak melakukan apa-apa dan membiarkannya disatukan. Juga, Anda menunjuk ke versi OpenCV yang sudah usang. Lebih baik menggunakan versi master atau menunjuk ke versi tertentu: lihat docs.opencv.org .