【发布时间】:2017-10-02 08:22:03
【问题描述】:
cv2.calcOpticalFlowFarneback 似乎在自然图像上工作得很好,但如果我在简单的合成示例上尝试它,例如下面的一个,它认为没有流量:
import cv2
import numpy as np
a = np.zeros((10, 10), dtype=np.uint8); a[1:4] = 127; a[2] = 255; a
等于
array([[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[127, 127, 127, 127, 127, 127, 127, 127, 127, 127],
[255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
[127, 127, 127, 127, 127, 127, 127, 127, 127, 127],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
b = np.roll(a, 1, 0); b
等于
array([[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[127, 127, 127, 127, 127, 127, 127, 127, 127, 127],
[255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
[127, 127, 127, 127, 127, 127, 127, 127, 127, 127],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
流程:
flow = cv2.calcOpticalFlowFarneback(a, b, pyr_scale=0.5, levels=3, winsize=15, iterations=3, poly_n=5, poly_sigma=1.2, flags=0)
本质上是0,因为
np.abs(flow).max()
计算为
1.3305091e-13
我尝试了不同的winsize 值,结果相似。
为什么会这样?还有其他参数在这里会更好吗?
(我的 OpenCV 版本是 2.4.8。版本 3 需要添加 None 作为第三个参数,我相信)
【问题讨论】:
-
是否适合
winsize = 15大小为(10,10)的“图像”?此外,当运动纯粹是仿射时,您的算法背后的算法似乎真的不喜欢 - 它使最小二乘算法背后的矩阵不可逆。见第4页底部here -
@DanielF 不确定哪个 winsize 合适,但
flow与其他winsize值(例如 2 或 5)基本上仍然为 0(例如 2 或 5)
标签: numpy opencv image-processing computer-vision opticalflow