CV2 光流函数不是确定性的

Posted

技术标签:

【中文标题】CV2 光流函数不是确定性的【英文标题】:CV2 optical flow function is not deterministic 【发布时间】:2020-08-18 04:13:28 【问题描述】:

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

【问题讨论】:

我也有同样的问题和有趣的事情:不确定的部分是(非常令人惊讶)cv2.cartToPolarflow 对于我的图像总是相同的,但是转换的行为很奇怪。我使用 OpenCV 4.5.1 【参考方案1】:

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

【讨论】:

以上是关于CV2 光流函数不是确定性的的主要内容,如果未能解决你的问题,请参考以下文章

cv2 Farneback 光流值太低

从前一帧和光流创建帧

光流法的例子1

光流法 例子2

OpenCV中的光流及视频特征点追踪

在计算光流时,为啥帧没有价值?