CV2 光流函数不是确定性的

CV2 optical flow function is not deterministic

我试图通过计算两个图像之间的光流幅度来获得运动量(在 Python 3.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)

我发现它是 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++版本:在我的Ubuntu 20.04中,C++版本不存在此错误,因为我没有安装IPP。