# Structure and Motion Toolkit in MATLAB

### Philip Torr (view profile)

04 Mar 2004 (Updated )

Structure and Motion Toolkit in MATLAB.

torr_estimateF( matches, m3, f_optim_parameters, method, set_rank2, f_init)
```%	By Philip Torr 2002

%this is a set of functions for minimizing F

function [f, f_sq_errors, n_inliers,inlier_index,F] = torr_estimateF( matches, m3, f_optim_parameters, method, set_rank2, f_init)

no_matches = length(matches);
x1 = matches(:,1);
y1 = matches(:,2);
x2 = matches(:,3);
y2 = matches(:,4);

if nargin <5
set_rank2 = 0;
end

switch lower(method)
%as in ransac and torr mlesac/mapsac papers
case {'mlesac',0}
no_samp = f_optim_parameters(1);
T = f_optim_parameters(2);
f = torr_mlesac_F(x1,y1,x2,y2, no_matches, m3, no_samp, T);
%function f = mlesac_F(x1,y1,x2,y2, n_matches, m3, no_samp, f_threshold)
%as in ransac and torr mlesac/mapsac papers

case {'mapsac',1}
if isempty(f_optim_parameters)
no_samp =1000;
T = 4;
else
no_samp = f_optim_parameters(1);
T = f_optim_parameters(2);
end
[f,f_sq_errors, n_inliers,inlier_index] = torr_mapsac_F(x1,y1,x2,y2, no_matches, m3, no_samp, T);

case {'linear',2}
f = torr_estf(x1,y1,x2,y2, no_matches,m3);

%as in Torr & Fitzgibbon paper
case {'bookstein',3}
f = torr_estf_bookstein(x1,y1,x2,y2, no_matches,m3);

case {'b+sampson','boosam',4}
f = torr_estf_bookstein_sampson(x1,y1,x2,y2, no_matches,m3);

case {'non_linear',5}
f = torr_nonlinf_mincon2x2(f_init, x1,y1,x2,y2, no_matches, m3);

case {'lin+non_lin',6}
set_rank2 = 1;
f = torr_estimateF(matches, m3, [], 'linear',set_rank2);
f = torr_estimateF(matches, m3, [], 'non_linear',set_rank2,f);

case {'hegel1',7}
f = torr_estimateF(matches, m3, [], 'linear');
f = ant_fnsf(x1,y1,x2,y2,m3,f);

otherwise
disp('Unknown method.')
end

F = reshape(f, 3, 3);
%make it my way round
F = F';

%the F matrix is defined like:
% (nx2, ny2, m3) f(1 2 3) nx1
%                 (4 5 6) ny1
%                 (7 8 9) m3

% disp('before rank 2')
% F
if set_rank2
[U,S,V] = svd(F);
S(3,3) = 0;
F = U*S*V';
f = reshape(F',9,1);
end
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% disp('after rank 2')
% F

% % Unit fro-norm F:
% fn = norm(F(:));
% fn = 2^(-floor(log(fn) / log(2)));
% F = F * fn;

F = F/norm(F,'fro');
f = f/norm(f);

switch lower(method)
case {'bookstein',3,'linear',2,'bookstein',3,'b+sampson','boosam',4,'non_linear',5,'lin+non_lin',6, ...
'hegel1',7}
%f = reshape(F',9,1);   %calculate squared errors (distance to manifold of F)
f_sq_errors = torr_errf2(f,x1,y1,x2,y2, no_matches, m3);
%next generate index set of inliers
T = 10;
inlier_index = find((f_sq_errors < T) == 1);
n_inliers = length(inlier_index);

end

```