flow1

Download MATLAB source: flow.zip.

% calculate the scene - a field of points
clear
close all
xr = -20:20;
yr = -20:60;
x = ones(length(yr),1)*xr;
y = yr'*ones(1,length(xr));
z = zeros(size(x));
disp('matrix size');
disp(size(x));
matrix size
    81    41

% draw the scene
figure(1);
plot3(x,y,z,'ko');
axis equal
axis off
camproj('perspective');
campos([0 -20 5]);
camtarget([0 -10 0]);
camva(30);
pos = campos();
tgt = camtarget();
% move the camera
delta = [0 0.2 0];
aviobj = avifile('flow2.avi','fps',20,'compression','Cinepak');
for k=1:101
    campos(pos+(k-1)*delta);
    camtarget(tgt+(k-1)*delta);
    drawnow;
    F = getframe(gcf);
    aviobj = addframe(aviobj,F);
end
aviobj = close(aviobj);
% do flow without MATLAB 3D graphpics


figure(2)
up = [0 0 1];
vn = pos - tgt;
vz = vn/norm(vn);
vx = cross(up,vz);
vx = vx/norm(vx);
vy = cross(vz,vx);
R = [vx' vy' -vz'];
T2 = [R  -R*pos'];

% test
disp('transform target point:');
disp(T2*[tgt 1]')

xp = x(:);
yp = y(:);
zp = z(:);

xform = T2*[xp'; yp'; zp'; ones(size(zp'))];
va = 30;
scl = 1/tan(va*pi/180);
idx = find(xform(3,:)>0); % select points in front of camera
xpts = xform(1,idx)./xform(3,idx)*scl;
ypts = xform(2,idx)./xform(3,idx)*scl;

plot(xpts,ypts,'ko');
axis([-0.7 0.7 -0.5 0.5]);
transform target point:
         0
         0
   11.1803

% traditional optical flow diagram
yp = y(:) - 0.2;
xform = T2*[xp'; yp'; zp'; ones(size(zp'))];
xnew = xform(1,idx)./xform(3,idx)*scl;
ynew = xform(2,idx)./xform(3,idx)*scl;

s = 80;
quiver(xpts,ypts,xnew-xpts,ynew-ypts,5,'k');
axis([-0.7 0.7 -0.5 0.5]);