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.cartToPolar
。 flow
对于我的图像总是相同的,但是转换的行为很奇怪。我使用 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 光流函数不是确定性的的主要内容,如果未能解决你的问题,请参考以下文章