Example of finding the fundamental matrix using RANSAC



im1.jpg

im2.jpg
    % Parameters
    nonmaxrad = 3;  % Non-maximal suppression radius
    dmax = 50;      % Maximum search distance for matching
    w = 11;         % Window size for correlation matching
    
    im1 = imread('im1.jpg');
    im2 = imread('im2.jpg');

    % Find 100 strongest Harris corners in image1 and image2
    [cim1, r1, c1] = harris(im1, 1, 0.04, 'N', 100, 'radius', nonmaxrad);
    show(im1,1), hold on, plot(c1,r1,'r+');

    [cim2, r2, c2] = harris(im2, 1, 0.04, 'N', 100, 'radius', nonmaxrad);
    show(im2,2), hold on, plot(c2,r2,'r+');

    [m1,m2] = matchbycorrelation(im1, [r1';c1'], im2, [r2';c2'], w, dmax);

    % Display putative matches
    show(im1,3), set(3,'name','Putative matches'), hold on    
    for n = 1:length(m1);
	line([m1(2,n) m2(2,n)], [m1(1,n) m2(1,n)])
    end

    % Assemble homogeneous feature coordinates for fitting of the
    % fundamental matrix, note that [x,y] corresponds to [col, row]
    x1 = [m1(2,:); m1(1,:); ones(1,length(m1))];
    x2 = [m2(2,:); m2(1,:); ones(1,length(m1))];    
    
    t = .001;  % Distance threshold for deciding outliers
    [F, inliers] = ransacfitfundmatrix(x1, x2, t);

    % Display both images overlayed with inlying matched feature points
    show(double(im1)+double(im2),4), set(4,'name','Inlying matches'), hold on    
    plot(m1(2,inliers),m1(1,inliers),'r+');
    plot(m2(2,inliers),m2(1,inliers),'g+');    

    for n = inliers
	line([m1(2,n) m2(2,n)], [m1(1,n) m2(1,n)],'color',[0 0 1])
    end
    % Step through each matched pair of points and display the
    % corresponding epipolar lines on the two images.
    
    l2 = F*x1;    % Epipolar lines in image2
    l1 = F'*x2;   % Epipolar lines in image1

    for n = inliers
	figure(1), clf, show(im1,1), hold on, plot(x1(1,n),x1(2,n),'r+');
	hline(l1(:,n));
	figure(2), clf, show(im2,2), hold on, plot(x2(1,n),x2(2,n),'r+');
	hline(l2(:,n));
	fprintf('hit any key to see next point\r'); pause
    end


Here's another way to visualize the matches suggested by José L. Crespo which works rather nicely. It displays each image with the putative matches marked as circles with different colors. Using the colorcube map produces different colors for nearby points allowing them to be distinguished from each other.

   col=colormap(colorcube(size(m2,2)));
   figure(1), imshow(im1,[]), hold on
   scatter(m1(2,:),m1(1,:),[],col);
   hold off
  
   figure(2), imshow(im2,[]), hold on
   scatter(m2(2,:),m2(1,:),[],col);
   hold off
testfund.m download the code above