代码之家  ›  专栏  ›  技术社区  ›  a3.14_Infinity

三维数据集的最小二乘拟合

  •  0
  • a3.14_Infinity  · 技术社区  · 15 年前

    其中一个步骤是在不稳定的摄像机路径下找到一个平滑的摄像机路径。 不稳定的摄像机路径会给视频带来抖动或抖动。 摄像机路径-(cx,cy,cz);

    所以现在我需要在(cx,cy,cz)指定的摄像机路径上进行最小二乘拟合;

    我遇到了polyfit(),它确实适合二维数据。 但我需要的是一个三维平滑曲线,适合不稳定的曲线。 提前谢谢。

    3 回复  |  直到 15 年前
        1
  •  1
  •   zellus    15 年前

    采用最小二乘法拟合:

    t = (1:0.1:5)';
    
    % model
    px = [ 5 2 1 ];
    x =  polyval(px,t);
    
    py = [ -2 1 1 ];
    y = polyval(py,t);
    
    pz = [ 1 20 1 ];
    z = polyval(pz,t);
    
    %  plot model
    figure
    plot3(x,y,z)
    hold all
    
    % simulate measurement 
    xMeasured = x+2*(rand(length(x),1)-0.5);
    yMeasured = y+2*(rand(length(y),1)-0.5);
    zMeasured = z+2*(rand(length(z),1)-0.5);
    
    % plot simulated measurements
    plot3(xMeasured, yMeasured, zMeasured,'or')
    hold off
    grid on
    
    % least squares fit 
    A = [t.^2, t, t./t];
    pxEstimated = A\xMeasured;
    pyEstimated = A\yMeasured;
    pzEstimated = A\zMeasured;
    
        2
  •  2
  •   Niki    15 年前

    顺便说一句:我认为你需要的是一个卡尔曼滤波器,而不是一个多项式拟合的相机路径。但我不确定matlab是否有内置的支持。

        3
  •  0
  •   a3.14_Infinity    15 年前

    首先让我感谢stackoverflow.com,然后感谢zellus和nikie让我开始更多地思考这个问题。所以现在我得到了一个解决方案,它遵循zellus方法,正如nikie所指出的,我使用了参数't'。 我的最终代码如下所示,适合三维数据集:

    t = linspace(1,343,343)';
    
     load cx.mat;
     load cy.mat;
     load cz.mat;
    
     plot3(cx, cy, cz,'r'),title('source Camera Path');
     hold all
    
     A = [t.^2, t, t./t];
     fx = A\cx;
     fy = A\cy;
     fz = A\cz;
    
    
     Xev = polyval(fx,t);
     Yev = polyval(fy,t);
     Zev = polyval(fz,t);
    
     plot3(Xev,Yev,Zev,'+b'),title('Fitting Line');
    

    我期待着与乐于助人的人就StackOverflow进行更有趣的讨论。