我正在使用matlab进行视频稳定(使摇晃的视频不摇晃)。 其中一个步骤是在不稳定的摄像机路径下找到平滑的摄像机路径。 不稳定的摄像机路径会给视频带来抖动或抖动。 我使用摄像机位置指定摄像机路径,这是一个3d数据。 相机路径 - (cx,cy,cz);
当我在matlab中绘图时,我可以直观地看到相机运动的抖动。 所以现在我要求在(cx,cy,cz)指定的摄像机路径上进行最小二乘拟合;
我遇到了适合二维数据的polyfit()。 但我需要的是一条适合摇晃曲线的三维平滑曲线。 提前谢谢。
答案 0 :(得分:2)
难道你不能只为cx(t),cy(t),cz(t)拟合三条单独的1d曲线吗?
BTW:我认为你需要的是卡尔曼滤波器,而不是适合摄像机路径的多项式。但是我不确定matlab是否内置了对它的支持。答案 1 :(得分:1)
使用最小二乘法的方法:
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 :(得分:0)
首先让我感谢stackoverflow.com然后感谢zellus和nikie,他让我更多地思考这个问题。所以现在我已经达到了遵循zellus方法的解决方案,并且nikie指出我使用了参数't'。 cx,cy,cz是3d空间中的坐标,在我的例子中,它们都是343x1双精度 我的最终代码如下所示,符合3d数据集:
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进行更有趣的讨论。