我试图通过计算两个图像(在Python3.7和cv2
V4.0中)之间的光流大小来获得运动量。但是通过相同的图像,我看到最终的值不是确定性的。有时打印inf
,有时打印7.372749678324908e-05
。
有什么问题吗?为什么它不是确定性的?!
def getOpticalMag(prev_image, curr_image):
prev_image_gray = cv2.cvtColor(prev_image, cv2.COLOR_BGR2GRAY)
curr_image_gray = cv2.cvtColor(curr_image, cv2.COLOR_BGR2GRAY)
flow = cv2.calcOpticalFlowFarneback(prev_image_gray, curr_image_gray, flow=None,
pyr_scale=0.5, levels=1, winsize=15,
iterations=2,
poly_n=5, poly_sigma=1.1, flags=0)
mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1])
return np.mean(mag)
发布于 2021-02-12 12:54:49
我发现这是OpenCV的底层IPP (IPPICV)部分的一个错误,为了让它更快地工作,它是随Python版本一起提供的,所以把它发布出来,它已经是https://github.com/opencv/opencv/issues/19506的里程碑了。
您可以使用numpy
编写您自己的从笛卡尔坐标到极坐标的转换器,如此特性请求https://github.com/numpy/numpy/issues/5228#issue-46746558中所示(如果您使用Python版的OpenCV,您已经有了NumPy )
def cartToPol(x, y):
ang = numpy.arctan2(y, x)
mag = numpy.hypot(x, y)
return mag, ang
另一个解决方案是不使用IPP编译OpenCV,或者使用OpenCV的C++版本:在我的Ubuntu20.04中,C++版本不存在这个错误,因为我没有安装IPP。
https://stackoverflow.com/questions/63461786
复制相似问题