Скорее всего, это неинициализированный массив, например, возвращаемый 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
должно быть 3x1 1x3 или 3x3. Действительно, 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.]]