www.pudn.com > SURF-based-image-stitching.rar > ransac1.m, change:2014-05-10,size:1945b

function [f inlierIdx] = ransac1( x,y,ransacCoef,funcFindF,funcDist ) %[f inlierIdx] = ransac1( x,y,ransacCoef,funcFindF,funcDist ) % Use RANdom SAmple Consensus to find a fit from X to Y. % X is M*n matrix including n points with dim M, Y is N*n; % The fit, f, and the indices of inliers, are returned. % % RANSACCOEF is a struct with following fields: % minPtNum,iterNum,thDist,thInlrRatio % MINPTNUM is the minimum number of points with whom can we % find a fit. For line fitting, it's 2. For homography, it's 4. % ITERNUM is the number of iteration, THDIST is the inlier % distance threshold and ROUND(THINLRRATIO*n) is the inlier number threshold. % % FUNCFINDF is a func handle, f1 = funcFindF(x1,y1) % x1 is M*n1 and y1 is N*n1, n1 >= ransacCoef.minPtNum % f1 can be of any type. % FUNCDIST is a func handle, d = funcDist(f,x1,y1) % It uses f returned by FUNCFINDF, and return the distance % between f and the points, d is 1*n1. % For line fitting, it should calculate the dist between the line and the % points [x1;y1]; for homography, it should project x1 to y2 then % calculate the dist between y1 and y2. minPtNum = ransacCoef.minPtNum; iterNum = ransacCoef.iterNum; thInlrRatio = ransacCoef.thInlrRatio; thDist = ransacCoef.thDist; ptNum = size(x,2); thInlr = round(thInlrRatio*ptNum); inlrNum = zeros(1,iterNum); fLib = cell(1,iterNum); for p = 1:iterNum % 1. fit using random points sampleIdx = randIndex(ptNum,minPtNum); f1 = funcFindF(x(:,sampleIdx),y(:,sampleIdx)); % 2. count the inliers, if more than thInlr, refit; else iterate dist = funcDist(f1,x,y); inlier1 = find(dist < thDist); inlrNum(p) = length(inlier1); if length(inlier1) < thInlr, continue; end fLib{p} = funcFindF(x(:,inlier1),y(:,inlier1)); end % 3. choose the coef with the most inliers [~,idx] = max(inlrNum); f = fLib{idx}; dist = funcDist(f,x,y); inlierIdx = find(dist < thDist); end