2013-02-07 40 views
8

我跟OpenCV的工作,我需要了解如何功能fitEllipse準確有效。我查看了(https://github.com/Itseez/opencv/blob/master/modules/imgproc/src/shapedescr.cpp)的代碼,我知道它使用最小二乘法來確定可能的省略號。我還查看了文件中給出的論文(Andrew W. Fitzgibbon,RBFisher.A Buyer's Guide to Conic Fitting.Proc.5th British Machine Vision Conference,Birmingham,pp.513-522,1995。)fitEllipse如何在OpenCV中工作?

但是我無法完全理解算法。例如,爲什麼它需要解決最小二乘問題的3倍?爲什麼bd在第一個svd之前被初始化爲10000(我猜這是初始化的隨機值,但爲什麼這個值可以是隨機的?)?爲什麼廣告中的值需要在第一個svd之前爲負數?

謝謝!

回答

1

這裏是Matlab代碼..它可能會幫助

function [Q,a]=fit_ellipse_fitzgibbon(data) 
    % function [Q,a]=fit_ellipse_fitzgibbon(data) 
    % 
    % Ellipse specific fit, according to: 
    % 
    % Direct Least Square Fitting of Ellipses, 
    % A. Fitzgibbon, M. Pilu and R. Fisher. PAMI 1996 
    % 
    % 
    % See Also: 
    % FIT_ELLIPSE_LS 
    % FIT_ELLIPSE_HALIR 

    [m,n] = size(data); 
    assert((m==2||m==3)&&n>5); 
    x = data(1,:)'; 
    y = data(2,:)'; 

    D = [x.^2 x.*y y.^2 x y ones(size(x))]; % design matrix 
    S = D'*D;         % scatter matrix 
    C(6,6)=0; C(1,3)=-2; C(2,2)=1; C(3,1)=-2; % constraints matrix 
    % solve the generalized eigensystem 
    [V,D] = eig(S, C); 
    % find the only negative eigenvalue 
    [n_r, n_c] = find(D<0 & ~isinf(D)); 
    if isempty(n_c), 
    warning('Error getting the ellipse parameters, will do LS'); 
    [Q,a] = fit_ellipse_ls(data); % 
    return; 
    end 
    % the parameters 
    a = V(:, n_c); 
    [A B C D E F] = deal(a(1),a(2),a(3),a(4),a(5),a(6)); % deal is slow! 
    Q = [A B/2 D/2; B/2 C E/2; D/2 E/2 F]; 
end % fit_ellipse_fitzgibbon 

Fitzibbon解決方案有一些數值穩定性雖然。請參閱Halir的工作以獲得解決方案。

它基本上是最小二乘法解決方案,但專門設計的,使得它將產生一個有效的橢圓,不僅僅是任何圓錐曲線。