Скорее всего, это неинициализированный массив, такой как возвращаемый np.empty
. Это вместе с переработкой памяти может привести к тому эффекту, который вы видите. Минимальный пример:
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]
Обратите внимание на то, как на первой итерации y
содержится мусор, а на каждой последующей итерации - значение предыдущей, x
поскольку ей назначается память, которая была освобождена непосредственно перед этим.
Мы можем легко проверить, что в исходном примере tvec
всплывает также предыдущий :
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]]
Мы можем далее предположить, что именно этот выбор rmat
вызывает ошибку.
Вероятно, это ошибка, которая eye(4)
вообще допускается, потому что официально она rmat
должна быть 3х1, 1х3 или 3х3. Действительно, 1D rmat
, у которого нет 3 элементов, корректно отклоняется оболочкой Python. Я подозреваю, что 2D-карты не проверены должным образом на уровне Python. Затем код C обнаруживает, что неправильная форма ничего не делает, за исключением возврата кода ошибки, который не проверяется кодом Python.
Действительно, использование rmat=eye(3)
эффекта исчезает:
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.]]