2013-02-07 8 views
8

Ich arbeite mit opencv und ich muss verstehen, wie funktioniert die Funktion fitEllipse genau funktioniert. Ich schaute auf den Code unter (https://github.com/Itseez/opencv/blob/master/modules/imgproc/src/shapedescr.cpp) und ich weiß, dass es kleinste Quadrate verwendet, um die wahrscheinlichen Ellipsen zu bestimmen. Ich schaute auch auf das Papier, das in der Dokumentation gegeben wurde (Andrew W. Fitzgibbon, RBFisher. Ein Leitfaden für Käufer zur konischen Anpassung. Proc. 5. Machine Vision Conference, Birmingham, S. 513-522, 1995.)Wie funktioniert fitEllipse in OpenCV?

Aber Ich kann den Algorithmus nicht genau verstehen. Zum Beispiel, warum muss das 3-fache Problem des kleinsten Quadrats gelöst werden? warum bd vor dem ersten svd auf 10000 initialisiert wird (ich vermute mal, es ist ein zufälliger Wert für die Initialisierung, aber warum kann dieser Wert zufällig sein?)? Warum müssen die Werte in Ad vor der ersten DVD negativ sein?

Vielen Dank!

Antwort

1

Hier Code Matlab .. es könnte

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 Lösung allerdings helfen, einige numerische Stabilität aufweist. Sehen Sie sich die Arbeit von Halir für eine Lösung an.

Es ist im Wesentlichen Lösung der kleinsten Quadrate, aber speziell so konzipiert, dass es eine Ellipse valide nicht nur jede Kegel produziert.