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