www.gusucode.com > IPCV_Eval_Kit_R2019a_0ce6858工具箱源码程序matlab > IPCV_Eval_Kit_R2019a_0ce6858/code/demo_files/I4_10_3_ransac.m

    %% RANSAC(MSAC)偵傛傞僲僀僘僨乕僞傊偺懡崁幃僼傿僢僥傿儞僌

%% 弶婜壔
clear; close all; clc; rng('default');

%% 曻暔嬋慄(2師娭悢)偺幃偐傜揰傪惗惉
x = (-10:0.1:10)';
y = (36-x.^2)/9;
figure
plot(x,y)
title('曻暔嬋慄(2師娭悢)')

%% 奜傟抣偲偟偰僲僀僘傪晅壛
y = y+rand(length(y),1);
y([50,150,99,199]) = [y(50)+12,y(150)-12,y(99)+33,y(199)-23];
plot(x,y)
title('曻暔嬋慄(2師娭悢)偵奜傟抣偲偟偰僲僀僘晅壛')
shg;

%% RANSAC(MSAC)偵傛傞懡崁幃僼傿僢僥傿儞僌
N = 2;           % 2師嬋慄
maxDistance = 1; % inlier(奜傟抣偱側偄)偲傒側偡嵟戝嫍棧

% 2師嬋慄偵僼傿僢僥傿儞僌
[P, inlierIdx] = fitPolynomialRANSAC([x,y],N,maxDistance);
disp('2師娭悢偺學悢(y=ax^2+bx+c)');
disp(P);

%% 僼傿僢僥傿儞僌寢壥偺壜帇壔
yRecoveredCurve = polyval(P,x);
figure
plot(x,yRecoveredCurve,'-g','LineWidth',3)
hold on
plot(x(inlierIdx),y(inlierIdx),'.',x(~inlierIdx),y(~inlierIdx),'ro')
legend('嬋慄','Inlier揰','Outlier揰(奜傟抣)')
hold off

%% 擟堄偺悢幃儌僨儖傊偺僼傿僢僥傿儞僌

%% 僼傿僢僥傿儞僌懳徾偺奜傟抣傪娷傓揰孮傪儘乕僪
load pointsForLineFitting.mat
plot(points(:,1),points(:,2),'o');
hold on
shg;

%% 嵟彫擇忔朄偱僼傿僢僥傿儞僌
% 奜傟抣偵堷偭挘傜傟偰偆傑偔僼傿僢僥傿儞僌偱偒側偄
modelLeastSquares = polyfit(points(:,1),points(:,2),1);
x = [min(points(:,1)) max(points(:,1))];
y = modelLeastSquares(1)*x + modelLeastSquares(2);
plot(x,y,'r-')
shg;

%% RANSAC(MSAC)偺僼傿僢僥傿儞僌娭悢偲昡壙娭悢傪愝掕
fitLineFcn = @(points) polyfit(points(:,1),points(:,2),1); % plyfit傪僼傿僢僥傿儞僌娭悢偵偡傞
evalLineFcn = ...   % 嬋慄偲揰偺嫍棧傪寁嶼偡傞娭悢
  @(model, points) sum((points(:, 2) - polyval(model, points(:,1))).^2,2);

%% RANSAC偱僼傿僢僥傿儞僌
sampleSize = 2; % RANSAC偺1儖乕僾偱僒儞僾儕儞僌偡傞揰悢
maxDistance = 2; % inlier(奜傟抣偱側偄)偲傒側偡儌僨儖偐傜偺嫍棧
[modelRANSAC, inlierIdx] = ransac(points,fitLineFcn,evalLineFcn, ...
  sampleSize,maxDistance);
modelRANSAC

%% inliner偺揰偩偗傪巊偭偰嵞搙丄plyfit偱嵟彫擇忔僼傿僢僥傿儞僌
modelInliers = polyfit(points(inlierIdx,1),points(inlierIdx,2),1);

%% 寢壥偺壜帇壔
inlierPts = points(inlierIdx,:);
x = [min(inlierPts(:,1)) max(inlierPts(:,1))];
y = modelInliers(1)*x + modelInliers(2);
plot(x, y, 'g-')
legend('奜傟抣傪娷傓娤應揰','嵟彫擇忔僼傿僢僥傿儞僌','RANSAC偵傛傞儘僶僗僩僼傿僢僥傿儞僌');
hold off
shg;

%% 
% Copyright 2018 The MathWorks, Inc.