我在python中使用opencv 4.0.0

当将cv2.cartToPolar的值设置为False并将x的值设置为False并将y的值设置为False时,调用函数angleInDegrees时,我得到了错误的答案。应该是pi,而不是3.14159274,它比pi大。

x = np.asarray([[-12]], dtype = "float64")
y = np.asarray([[0]], dtype = "float64")

mag, angle = cv2.cartToPolar(x, y, angleInDegrees=True)
print('mag', mag)
print('angle', angle)

>>> mag [[12.]]
>>> angle [[180.]]

x = np.asarray([[-12]], dtype = "float64")
y = np.asarray([[0]], dtype = "float64")

mag, angle = cv2.cartToPolar(x, y, angleInDegrees=False)
print('mag', mag)
print('angle', angle)

>>> mag [[12.]]
>>> angle [[3.14159274]]

我期望3.14159265的输出。

最佳答案

这是一个有趣的观察。这必须与@Sushi指出的浮点运算的精度有关。根据文档herecv2.cartToPolar函数的输出由

python - 精度丢失,将angleInDegrees设置为False的调用cv2.cartToPolar-LMLPHP

x = np.asarray([[-12]], dtype = "float32")
y = np.asarray([[0]], dtype = "float32")

print(cv2.cartToPolar(x, y, angleInDegrees=False)[1])
print(np.radians(np.arctan2(y, x) * 180 / np.pi))

x = np.asarray([[-12]], dtype = "float64")
y = np.asarray([[0]], dtype = "float64")

print(cv2.cartToPolar(x, y, angleInDegrees=False)[1])
print(np.radians(np.arctan2(y, x) * 180 / np.pi))

输出:
[[3.1415927]]
[[3.1415927]]
[[3.14159274]]
[[3.14159265]]  # check this result

09-06 03:56