8

私はopencvを使用していますが、関数fitEllipseがどのように機能するかを理解する必要があります。( https://github.com/Itseez/opencv/blob/master/modules/imgproc/src/shapeescr.cpp )でコードを調べたところ、最小二乗法を使用して楕円の可能性が高いことがわかりました。また、ドキュメンテーションに記載されている論文 (Andrew W. Fitzgibbon, RBFisher. A Buyer's Guide to Conic Fitting. Proc.5th British Machine Vision Conference, Birmingham, pp. 513-522, 1995.) も参照しました。

しかし、アルゴリズムを正確に理解することはできません。たとえば、なぜ 3 倍の最小二乗問題を解く必要があるのでしょうか。最初のsvdの前にbdが10000に初期化されるのはなぜですか(初期化のランダム値だと思いますが、なぜこの値がランダムになるのでしょうか?)? 最初の svd の前に Ad の値を負にする必要があるのはなぜですか?

ありがとうございました!

4

1 に答える 1

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 の作業を参照してください。

これは本質的に最小二乗法ですが、円錐曲線だけでなく、有効な楕円を生成するように特別に設計されています。

于 2013-04-20T01:53:41.580 に答える