наименьших квадратов, подходящих для трехмерного набора данных - PullRequest
0 голосов
/ 09 ноября 2010

Я работаю над стабилизацией видео (делая шаткие видео не шаткими), используя matlab. Один из шагов - найти плавный путь камеры с учетом нестабильного пути камеры. Нестабильный путь камеры - это то, что дает дрожание или дрожание видео. У меня есть путь камеры, указанный с помощью положения камеры, которое является 3D-данными. путь камеры - (cx, cy, cz);

Когда я строю графики в Matlab, я могу визуально увидеть дрожание движения камеры. Так что теперь мне требуется подгонка наименьших квадратов для пути камеры, указанного в (cx, cy, cz);

Я наткнулся на polyfit (), который подгоняет для двумерных данных. Но то, что мне нужно, это плавная кривая, подходящая к шаткой кривой. Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 09 ноября 2010

Не могли бы вы просто подогнать три отдельные 1d кривые для cx (t), cy (t), cz (t)?

Кстати: я думаю, что вам нужен фильтр Калмана, а не полином, подходящий для траектории камеры. Но я не уверен, что Matlab имеет встроенную поддержку для этого.

1 голос
/ 09 ноября 2010

Подход с использованием метода наименьших квадратов:

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;
0 голосов
/ 12 ноября 2010

Позвольте мне прежде всего поблагодарить stackoverflow.com, а затем мою благодарность Зеллусу и Ники, которые заставили меня больше думать о проблеме.Итак, теперь я достиг решения, которое следует за Zellus-подходом, и, как указал Никки, я использовал параметр 't'.cx, cy, cz - это координаты в трехмерном пространстве, и в моем случае они все являются двойными 343x1. Мой окончательный код показан ниже, который соответствует трехмерному набору данных:

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 с замечательными полезными людьми.

...