如何在图像上应用逆光流向量?

时间:2016-07-19 08:12:06

标签: matlab image-processing vector computer-vision opticalflow

我有一个关于在移动相机中移动物体检测的小项目,其中我必须使用负光流向量来最小化自我运动补偿。我有一个视频和一些特定的连续帧,其中必须计算负光流向量的平均值。我已经计算了说,(k-1)和第k帧之间的光流。此外,我已经计算了光流向量V = [u,v]的平均值,其中v是水平光流的平均值,u是垂直流的平均值。现在,我必须将光流向量的逆,即-V应用于第(k-1)帧。我是matlab的新手,我不太了解它。请帮忙

我已尝试过此代码段,但结果不符合预期

function I1=reverseOF(I,V) R=I(:,:,1); G=I(:,:,2); B=I(:,:,3); [m,n]=size(rgb2gray(I)); for i=1:m for j=1:n v1=[j i]; v2=-V; v3=v1.*v2; R(floor(1+abs(v3(1,2))),floor(1+abs(v3(1,2))))=R(i,j); G(floor(1+abs(v3(1,2))),floor(1+abs(v3(1,2))))=G(i,j); B(floor(1+abs(v3(1,2))),floor(1+abs(v3(1,2))))=B(i,j); I1(floor(1+abs(v3(1,2))),floor(1+abs(v3(1,2))))=I(i,j); end end I1=cat(3,R,G,B); enter code here

我使用了abs()函数,因为否则出现了一些错误,例如“试图访问负位置;索引必须是正面或逻辑”。

图像A和图像B是我用来估算光流的图像。enter image description here

这是我在应用上述功能后获得的结果。 enter image description here

1 个答案:

答案 0 :(得分:2)

不幸的是,你不能轻易做到这一点。这是一个非常先进的研究问题,因为在网格上获得矢量场的倒数并不是一个容易的问题,实际上它很难。

请注意,您的矢量场(光流)从网格中开始,但它并不以网格结束,它以随机子像素位置结束。如果你只是反转这个字段,那么-V是不够的!结果不会相反!

这是一个开放的研究问题,例如在this 2010 paper处找到解决此问题的方法,并提出了一种方法来创建" pseudoinverses"。

假设你有逆,因为你以某种方式计算它。你的代码非常糟糕,并且解决方案(绝对!)显示(没有冒犯)你并不真正理解你在做什么。对于已知的矢量场{Vx,Vy},大小等于图像大小(如果不是,您可以很容易地弄清楚如何插入unsig interp2)代码看起来像:

newimg=zeros(size(I));

[ix,iy]=meshgrid(1:size(I,1),1:size(I,2));

newimg(:,:,1)=interp2(I(:,:,1),ix+Vx,iy+Vy); % this is your whole loop.
newimg(:,:,2)=interp2(I(:,:,3),ix+Vx,iy+Vy); % this is your whole loop.
newimg(:,:,3)=interp2(I(:,:,2),ix+Vx,iy+Vy); % this is your whole loop.