gpt4 book ai didi

python - Python在cv2.Rodrigues计算期间的结果更改

转载 作者:行者123 更新时间:2023-12-03 12:59:35 24 4
gpt4 key购买 nike

如果我运行:

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()

我得到:
[[6.92798859e-310]
[2.19380404e-316]
[1.58101007e-322]]
[[0.]
[0.]
[0.]]

因此 changes()的结果发生了变化。

我不明白为什么会这样,而且如果将 tvec=np.zeros(3)行注释掉,它会停止更改,这让我感到这是系统中的错误。

最佳答案

这很可能是未初始化的数组,例如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的值,因为它被分配了刚刚释放的内存。

我们可以轻松地在原始示例中检查是否还 pop 了前面的 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。确实,没有3个元素的一维 rmat被Python包装器正确拒绝了。我怀疑2D´rmat`s在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.]]

关于python - Python在cv2.Rodrigues计算期间的结果更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58969553/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com