用样条曲线勾勒出你的手(Matlab)

时间:2014-03-14 14:03:06

标签: matlab interpolation spline

我正在尝试编写一个脚本,以便可以将手放在屏幕上,使用ginput单击几个点,然后让matlab使用样条线生成人手的轮廓。但是,我很不确定如何使用样条曲线连接点击产生的点,因为它们当然是通过某种参数化来描述的。当点不应该从左到右连接时,如何使用matlab内置的样条命令?

到目前为止,我所拥有的代码并不多,它只是制作了一个框,让你点击一些点

FigHandle = figure('Position', [15,15, 1500, 1500]);
rectangle('Position',[0,0,40,40])
daspect([1,1,1])
[x,y] = ginput;

所以我想我的问题是如何处理x和y,这样你就可以按照“按时间顺序”连接它们。 (并且,最后,将最后一个连接到第一个)

3 个答案:

答案 0 :(得分:4)

查看函数cscvn

curve = cscvn(points) 

返回通过给定序列点(:j),j = 1:end的参数变分或自然三次样条曲线(以ppform形式)。

这里有一个很好的例子: http://www.mathworks.com/help/curvefit/examples/constructing-spline-curves-in-2d-and-3d.html

答案 1 :(得分:3)

我找到了使用cscvn函数的替代方法。

使用半arclength参数化,我可以从数组x和y创建样条曲线,如下所示:

diffx = diff(x);
diffy = diff(y);
t = zeros(1,length(x)-1);
for n = 1:length(x)-1 
    t(n+1) = t(n) + sqrt(diffx(n).^2+diffy(n).^2);
end
tj = linspace(t(1),t(end),300);

xj = interp1(t,x,tj,'spline');
yj = interp1(t,y,tj,'spline');
plot(x,y,'b.',xj,yj,'r-')

这会产生相当不错的轮廓。

这样做的好处是可以通过使用线段连接曲线上的有限数量的点来创建多边形路径来近似平面中的曲线。使用这个,我们可以用t来对点(x,y)进行参数化。由于我们只有几个点来创建t,我们通过在两者之间添加线性间隔点来创建更多。使用函数interp1,我们然后找到对应于这些线性间隔t,ti的x和y的中间值。

答案 2 :(得分:1)

以下是使用线性插值的示例:Interpolating trajectory from unsorted array of 2D points where order matters。这样可以获得与plot(x,y)相同的结果。

该帖子中的想法是遍历每对连续点并在这些点之间进行插值。你可能能够调整它以使用样条曲线,你需要每次给它4分,但这可能会导致问题,因为它们可以加倍。

要连接起点和终点,只需在插值前执行此操作:

x(end+1) = x(1);
y(end+1) = y(1);