⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fitline.m

📁 MATLAB Functions for Multiple View Geometry
💻 M
字号:
% FITLINE - Least squares fit of a line to a set of points%% Usage:   [C, dist] = fitline(XY)%% Where:   XY  - 2xNpts array of xy coordinates to fit line to data of%                the form %                [x1 x2 x3 ... xN%                 y1 y2 y3 ... yN]%% Returns: C    - 3x1 array of line coefficients in the form%                 c(1)*X + c(2)*Y + c(3) = 0%          dist - Array of distances from the fitted line to the supplied%                 data points.  Note that dist is only calculated if the%                 function is called with two output arguments.%% The magnitude of C is scaled so that line equation corresponds to%   sin(theta)*X + (-cos(theta))*Y + rho = 0% where theta is the angle between the line and the x axis and rho is the% perpendicular distance from the origin to the line.  Rescaling the% coefficients in this manner allows the perpendicular distance from any% point (x,y) to the line to be simply calculated as%   r = abs(c(1)*X + c(2)*Y + c(3))%%% If you want to convert this line representation to the classical form %     Y = a*X + b% use%  a = -c(1)/c(2)%  b = -c(3)/c(2)%% Note, however, that this assumes c(2) is not zero% 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 - Original version% September 2004 - Rescaling to allow simple distance calculation.function [C, dist] = fitline(XY)    [rows,npts] = size(XY);        if rows ~=2    error('Data is not 2D');  end    if npts < 2    error('Too few points to fit line');  end    % Set up constraint equations of the form  AC = 0,  % where C is a column vector of the line coefficients  % in the form   c(1)*X + c(2)*Y + c(3) = 0.    A = [XY' ones(npts,1)];  % Build constraint matrix    if npts == 2             % Pad A with zeros    A = [A; zeros(1,3)];   end  [u d v] = svd(A);        % Singular value decomposition.  C = v(:,3);              % Solution is last column of v.  % Rescale coefficients so that line equation corresponds to  %   sin(theta)*X + (-cos(theta))*Y + rho = 0  % so that the perpendicular distance from any point (x,y) to the line  % to be simply calculated as   %   r = abs(c(1)*X + c(2)*Y + c(3))  theta = atan2(C(1), -C(2));  % Find the scaling (but avoid dividing by zero)  if abs(sin(theta)) > abs(cos(theta))      k = C(1)/sin(theta);  else      k = -C(2)/cos(theta);  end    C = C/k;    % If requested, calculate the distances from the fitted line to  % the supplied data points   if nargout==2         dist = abs(C(1)*XY(1,:) + C(2)*XY(2,:) + C(3));  end                

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -