显然,这是Rodrigues函数中的一个错误...
如果您阅读相应文档,您可能会看到cv2.Rodrigues有两种不同的接口:
一种模仿C++接口,其中旋转向量(和可选的Jacobian矩阵)通过引用传递并由函数修改
cv2.Rodrigues(src, dst[, jacobian]) --> None
还有一种更加Pythonic的方式,将旋转向量和雅可比矩阵作为元组返回。
cv2.Rodrigues(src) --> dst, jacobian
如果您使用第一个接口,pb 会消失...
import numpy as np
import cv2
def changes():
rmat=np.eye(4)
tvec=np.zeros(3)
cv2.Rodrigues(rmat, tvec)
print(tvec)
for i in range(2):
changes()
结果:
[0. 0. 0.]
[0. 0. 0.]
进一步调查后编辑:
这个函数的问题比预期的还要严重:在使用第一个接口时,参数dst
和jacobian
没有被修改,这与文档字符串完全相矛盾:
>>> help(cv2.Rodrigues)
Help on built-in function Rodrigues:
Rodrigues(...)
Rodrigues(src[, dst[, jacobian]]) -> dst, jacobian
. @brief Converts a rotation matrix to a rotation vector or vice versa.
.
. @param src Input rotation vector (3x1 or 1x3) or rotation matrix (3x3).
. @param dst Output rotation matrix (3x3) or rotation vector (3x1 or 1x3), respectively.
. @param jacobian Optional output Jacobian matrix, 3x9 or 9x3, which is a matrix of partial
. derivatives of the output array components with respect to the input array components.
换句话说,这显然需要一份错误报告...
rvec = None
,则changes()
停止更改。但至少我可以回答问题_a_:是的,你正在发疯。而且你还拖着我们一起发疯 :) - caxcaxcoatlnp.eye(4)
不正确,请使用np.eye(3)
。函数创建了rvec
和jacobian
矩阵到一定的大小,但没有初始化。由于输入形状不正确,它什么也没做。在 PR 中添加了大小检查。 - Catree