Скорее всего, это неинициализированный массив, такой как возвращаемый 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.]]