Computer vision 光流示例

Computer vision 光流示例,computer-vision,opticalflow,Computer Vision,Opticalflow,我对光流有一个概念上的怀疑。亮度恒定性约束声明: ∂我/∂x vx+∂我/∂y vy+∂我/∂t=0 该示例是时间t处的2×2图像[1 0;0 0]。现在,假设在时间t+1,它被移动了[a]个像素(假设a是分数并且小于1)。然后,新图像是[(1-a)(1-a)a(1-a); (1-a)*a*a] 现在,如果我们拟合原始方程中的值,Ix=Iy=-1,它=-2*a+a*a,在(1,1)处。(我使用了Ix(x,y)=I(x+1,y)-I(x,y)) 这使得∂我/∂x vx+∂我/∂y vy+∂我/∂t

我对光流有一个概念上的怀疑。亮度恒定性约束声明: ∂我/∂x vx+∂我/∂y vy+∂我/∂t=0

该示例是时间t处的2×2图像[1 0;0 0]。现在,假设在时间t+1,它被移动了[a]个像素(假设a是分数并且小于1)。然后,新图像是[(1-a)(1-a)a(1-a); (1-a)*a*a]

现在,如果我们拟合原始方程中的值,Ix=Iy=-1,它=-2*a+a*a,在(1,1)处。(我使用了Ix(x,y)=I(x+1,y)-I(x,y))


这使得∂我/∂x vx+∂我/∂y vy+∂我/∂t=a*a-4*a。如果a非常小,即使如此,它也可以近似为4*a,而不是零。帮帮我

首先,它不是你要处理的BCC,而是它的一阶近似值,通常称为光流约束(OFC)

OFC将不适用于您的示例,原因是您正在对衍生品进行适当的估计

当您注意到有两个图像,一个用于t=0,另一个用于t=1时,应该会出现一些问题的第一个提示。你应该用哪一个来估计I_x和I_y导数?你选了t=0,为什么不选t=1?一种方法可以是同时取二者,然后取平均值,即:

I_x=(I_x(t=0)+I_y(t=1))/2

这样做将导致导数过滤器不再是2点,而是4点,内核延伸到t域。许多光流专家使用两种I_x代替平均,得到两种光流:一种向前,一种向后,然后可以对其进行后处理

如何选择导数估计器将对光流算法的行为产生至关重要的影响

在处理微分方程的数值估计时,更常见的是使用集中微分估计,即:

I_x=(I(x+1,y)-I(x-1,y))/2

在光流中,这是很常见的,然后在接近图像边界时恢复为较小的单面差

然而,这仍然不会像您希望的那样,在持有OFC时表现良好。如果您调查OFC,可以将其改写为:

I_t=-I_x v_x-I_y I_y

I|t=-|v|(kgrad(I))

其中,v=(v|x,v|y)=v|(cos(a),sin(a))是运动矢量,k=(cos(a),sin(a))是运动的单位矢量。这个量(kgrad(I))就是所谓的方向导数。为了保持这一点,您也不应该使用两点集中差异。您应该做的是使用共享同一内核/支持区域的I_t、I_x和I_y的估计值。例如,这可以是3×3×2大小的过滤器

在Matlab中,这方面的代码可以是:

[dx, dy, dt] = grad3D(imNew,imPrev)

gg = [0.2163, 0.5674, 0.2163]; 
f = imNew + imPrev; 
dx = f(:,[2:end end]) - f(:,[1 1:(end-1)]); 
dx = conv2(dx,gg','same');

dy = f([2:end end],:) - f([1 1:(end-1)],:); 
dy = conv2(dy,gg ,'same');

dt = 2*conv2(gg,gg,imNew - imPrev,'same');
人们有时仍然使用较小的派生过滤器的原因是因为不会丢失任何分辨率,这是使用较大内核的缺点。请注意,上述导数估计算法与在较粗的尺度上执行2点导数不同。很多人都这么认为,但事实并非如此

在我写的文章中,你可以对这些问题有更多的直觉。使用以下选项运行工具箱:

in.method = 'gradient'; 

您将获得一个交互式选项,这可能会帮助您获得更多的直觉。

边界效果如何?我不确定您的意思。。最近有人向我介绍了这个话题。你能提供一些细节吗?