有一篇文章描述了如何从眼睛照片中检测瞳孔。
在瞳孔检测的第 4 步,他们使用 我不理解的将每个片段分解为正弦分量的方法。
他们说
我们将方程 1 拟合到沿边界提取的点,以提取自由参数、、和。
但我不明白它们是如何从多边形段到椭圆自由参数的。
我应该为这些步骤使用一些明显的计算算法来获得它们吗?
有一篇文章描述了如何从眼睛照片中检测瞳孔。
在瞳孔检测的第 4 步,他们使用 我不理解的将每个片段分解为正弦分量的方法。
他们说
我们将方程 1 拟合到沿边界提取的点,以提取自由参数、、和。
但我不明白它们是如何从多边形段到椭圆自由参数的。
我应该为这些步骤使用一些明显的计算算法来获得它们吗?
他们只是使用非线性曲线拟合算法对两个方程 但是,拟合的准确性取决于算法的选择,您必须小心确保和始终为正(通过添加约束)。
解决问题的一种方法如下所示(使用 Octave)。
fig1 = figure()
gca
[x, y, buttons] = ginput(10)
plot(x, y, 'x-');
hold on;
k = convhull(x,y)
plot(x(k), y(k), "r-")
xx = zeros(length(k)-1)
yy = zeros(length(k)-1)
for i=1:length(k)-1
xx(i) = x(k(i));
yy(i) = y(k(i));
end
x_cen = mean(xx);
y_cen = mean(yy);
plot(x_cen, y_cen, 'mo');
for i=1:length(xx)
theta(i) = atan2(yy(i)-y_cen, xx(i)-x_cen);
end
angle = theta*180/pi
fig2 = figure();
plot(angle, yy, 'r-'); hold on;
plot(angle, xx, 'b-');
pkg load optim
indep_omega = theta(1:length(theta))
obs_x = xx(1:length(theta)) - x_cen
obs_y = yy(1:length(theta)) - y_cen
% Model functions
fx_omega = @ (p, omega) p(1) - p(2) * sin(omega)
fy_omega = @ (p, omega) p(1) + p(2) * cos(omega)
% Initial values
init_p_x = [0; 0.5]
init_p_y = [0; 0.5]
% Constraints (A.' * p + B >= 0)
A = [0; 1] ; B = 0;
settings = optimset ("inequc", {A, B});
[p_x, model_values, cvg, outp] = nonlin_curvefit(fx_omega, init_p_x, indep_omega, obs_x', settings)
[p_y, model_values, cvg, outp] = nonlin_curvefit(fy_omega, init_p_y, indep_omega, obs_y', settings)