gpt4 book ai didi

numpy - 为什么 cv2.calcOpticalFlowFarneback 在简单的合成示例上失败?

转载 作者:太空宇宙 更新时间:2023-11-03 21:25:10 26 4
gpt4 key购买 nike

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 作为第三个参数,我相信)

最佳答案

原因是here [1] 等式 19、20、23 和 25。

值得注意的是,(抱歉,没有 mathJax grumble 很难写方程)

I_x[x,y] = (A[x-1, y] - A[x+1, y]) / 2  # Equation 19

这在您的示例中减少为 np.zeros((10,10)),这会导致后续问题:

G = sum([[I_x**2, I_x * I_y],[I_x * I_y, I_y**2]], axis = (2,3))  # Equation 23

由于 I_x 为零,这意味着 G 采用以下形式

G = [[0, 0], [0, I_y**2]]

无处不在,这是一个奇异矩阵。由于需要反转,求解器卡住了。

之后发生的事情很难理解(我不能很好地阅读 c 来深入研究 openCV 核心代码),但似乎跳过了奇异矩阵基于 calcOpticalFlowPyrLKminEigThreshold 参数的文档.这可能意味着您的输出是缓冲区垃圾,或者至少是缓冲区垃圾的某种高斯混合。

这也是为什么@JulioDanielReyes 在添加噪声参数时能够得到响应 - 这添加了足够的 I_x 项来使 G 非奇异。

引用:

[1] Lucas Kanade 特征跟踪器的金字塔式实现算法描述,Jean-Yves Bouguet

关于numpy - 为什么 cv2.calcOpticalFlowFarneback 在简单的合成示例上失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46521885/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com