


Coarse-to-fine optical flow using Lucas&Kanade or Horn&Schunck.
Implemented 'type' of optical flow estimation:
LK: http://en.wikipedia.org/wiki/Lucas-Kanade_method
HS: http://en.wikipedia.org/wiki/Horn-Schunck_method
SD: Simple block-based sum of absolute differences flow
LK is a local, fast method (the implementation is fully vectorized).
HS is a global, slower method (an SSE implementation is provided).
SD is a simple but potentially expensive approach.
Common parameters: 'smooth' determines smoothing prior to computing flow
and can make flow estimation more robust. 'filt' determines amount of
median filtering of the computed flow field which improves results but is
costly. 'minScale' and 'maxScale' control image scales in the pyramid.
Setting 'maxScale'<1 results in faster but lower quality results, e.g.
maxScale=.5 makes flow computation about 4x faster. Method specific
parameters: 'radius' controls window size (and smoothness of flow) for LK
and SD. 'nBlock' determines number of blocks tested in each direction for
SD, computation time is O(nBlock^2). For HS, 'alpha' controls tradeoff
between data and smoothness term (and smoothness of flow) and 'nIter'
determines number of gradient decent steps.
USAGE
[Vx,Vy,reliab] = opticalFlow( I1, I2, pFlow )
INPUTS
I1, I2 - input images to calculate flow between
pFlow - parameters (struct or name/value pairs)
.type - ['LK'] may be 'LK', 'HS' or 'SD'
.smooth - [1] smoothing radius for triangle filter (may be 0)
.filt - [0] median filtering radius for smoothing flow field
.minScale - [1/64] minimum pyramid scale (must be a power of 2)
.maxScale - [1] maximum pyramid scale (must be a power of 2)
.radius - [10] integration radius for weighted window [LK/SD only]
.nBlock - [5] number of tested blocks [SD only]
.alpha - [1] smoothness constraint [HS only]
.nIter - [250] number of iterations [HS only]
OUTPUTS
Vx, Vy - x,y components of flow [Vx>0->right, Vy>0->down]
reliab - reliability of flow in given window
EXAMPLE - compute LK flow on test images
load opticalFlowTest;
[Vx,Vy]=opticalFlow(I1,I2,'smooth',1,'radius',10,'type','LK');
figure(1); im(I1); figure(2); im(I2);
figure(3); im([Vx Vy]); colormap jet;
EXAMPLE - rectify I1 to I2 using computed flow
load opticalFlowTest;
[Vx,Vy]=opticalFlow(I1,I2,'smooth',1,'radius',10,'type','LK');
I1=imtransform2(I1,[],'vs',-Vx,'us',-Vy,'pad','replicate');
figure(1); im(I1); figure(2); im(I2);
EXAMPLE - compare LK/HS/SD flows
load opticalFlowTest;
prm={'smooth',1,'radius',10,'alpha',20,'nIter',250,'type'};
tic, [Vx1,Vy1]=opticalFlow(I1,I2,prm{:},'LK'); toc
tic, [Vx2,Vy2]=opticalFlow(I1,I2,prm{:},'HS'); toc
tic, [Vx3,Vy3]=opticalFlow(I1,I2,prm{:},'SD','minScale',1); toc
figure(1); im([Vx1 Vy1; Vx2 Vy2; Vx3 Vy3]); colormap jet;
See also convTri, imtransform2, medfilt2
Piotr's Computer Vision Matlab Toolbox Version 3.50
Copyright 2014 Piotr Dollar. [pdollar-at-gmail.com]
Licensed under the Simplified BSD License [see external/bsd.txt]