% TESTFITPLANE - demonstrates RANSAC plane fitting % % Usage: testfitplane(outliers, sigma, t, feedback) % % Arguments: % outliers - Fraction specifying how many points are to be % outliers. % sigma - Standard deviation of inlying points from the % true plane. % t - Distance threshold to be used by the RANSAC % algorithm for deciding whether a point is an % inlier. % feedback - Optional flag 0 or 1 to turn on RANSAC feedback % information. % % Try using: testfitplane(0.3, 0.05, 0.05) % % See also: RANSACFITPLANE, FITPLANE % Copyright (c) 2003-2005 Peter Kovesi % School of Computer Science & Software Engineering % The University of Western Australia % http://www.csse.uwa.edu.au/ % % Permission is hereby granted, free of charge, to any person obtaining a copy % of this software and associated documentation files (the "Software"), to deal % in the Software without restriction, subject to the following conditions: % % The above copyright notice and this permission notice shall be included in % all copies or substantial portions of the Software. % % The Software is provided "as is", without warranty of any kind. % June 2003 function testfitplane(outliers, sigma, t, feedback) if nargin == 3 feedback = 0; end % Hard wire some constants - vary these as you wish npts = 100; % Number of 3D data points % Define a plane ax + by + cz + d = 0 a = 10; b = -3; c = 5; d = 1; B = [a b c d]'; B = B/norm(B); outsigma = 30*sigma; % outlying points have a distribution that is % 30 times as spread as the inlying points vpts = round((1-outliers)*npts); % No of valid points opts = npts - vpts; % No of outlying points % Generate npts points in the plane X = rand(1,npts); Y = rand(1,npts); Z = (-a*X -b*Y -d)/c; XYZ = [X Y Z]; % Add uniform noise of +/-sigma XYZ = XYZ + (2*rand(size(XYZ))-1)*sigma; % Generate opts random outliers n = length(XYZ); ind = randperm(n); % get a random set of point indices ind = ind(1:opts); % ... of length opts % Add uniform noise of outsigma to the points chosen to be outliers. % XYZ(:,ind) = XYZ(:,ind) + (2*rand(3,opts)-1)*outsigma; XYZ(:,ind) = XYZ(:,ind) + sign(rand(3,opts)-.5).*(rand(3,opts)+1)*outsigma; % Display the cloud of points figure(1), clf, plot3(XYZ(1,:),XYZ(2,:),XYZ(3,:), 'r*'); % Perform RANSAC fitting of the plane [Bfitted, P, inliers] = ransacfitplane(XYZ, t, feedback); fprintf('Original plane coefficients: '); fprintf('%8.3f ',B); fprintf('\nFitted plane coefficients: '); fprintf('%8.3f ',Bfitted); fprintf('\n'); % Display the triangular patch formed by the 3 points that gave the % plane of maximum consensus patch(P(1,:), P(2,:), P(3,:), 'g') box('on'), grid('on'), rotate3d('on') fprintf('\nRotate image so that planar patch is seen edge on\n'); fprintf('If the fit has been successful the inlying points should\n'); fprintf('form a line\n\n');