метод наименьших квадратов, подходящий для трехмерного набора данных

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

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

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


person a3.14_Infinity    schedule 09.11.2010    source источник


Ответы (3)


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

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;
person zellus    schedule 09.11.2010
comment
Я начинающий пользователь матлаба. Не потратите ли вы время на изменение своего примера и объясните мне, как выполняется подгонка методом наименьших квадратов. Модификация, которую вы можете поместить, заключается в том, что «вместо того, чтобы определить t, а затем выполнить некоторый поливал, чтобы получить x, y, z», вам уже даны координаты (cx, cy, cz), а затем как вы определяете матрицу A в этом случае и подходят ли наименьшие квадраты? - person a3.14_Infinity; 11.11.2010
comment
@gansai: Все, что вам нужно сделать, это заменить xMeasured на cx, yMeasured на cy и zMeasured на cz, соблюдая размеры. 't' – вектор времени для применяемой полиномиальной модели x=at^2+bt+c. Подгонка методом наименьших квадратов выполняется с помощью команды mldivide '\'. - person zellus; 11.11.2010

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

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

person Niki    schedule 09.11.2010
comment
Да — попробуйте эту отправку FEX: mathworks.com/matlabcentral/fileexchange / - person Bill Cheatham; 09.11.2010
comment
Нет, мне нужно получить трехмерную кривую, представляющую плавный путь. Я мог бы использовать фильтр Калмана, но поскольку я пытаюсь реализовать документ, я следую алгоритму, который делает это без использования фильтра Калмана. - person a3.14_Infinity; 11.11.2010
comment
@gansai: Как вы думаете, в чем разница между подгонкой одной 3D-кривой и подгонкой трех 1D-функций? Если вы используете метод наименьших квадратов для подбора многочлена, я не думаю, что есть какая-то разница. - person Niki; 11.11.2010
comment
в порядке. Поскольку я наивный пользователь Matlab, я спрашиваю: как мне подогнать три функции 1d к cx, cy, cz? и у меня нет параметра 't' в моей проблеме. - person a3.14_Infinity; 11.11.2010
comment
@gansai: Тогда вам нужно объяснить, что такое cx/cy/cz. Я думал, что это координаты в трехмерном пространстве, которые были у камеры при получении каждого кадра. Тогда t будет временем каждого кадра. - person Niki; 11.11.2010
comment
Да, cx, cy, cz представляет собой координаты в трехмерном пространстве. Но параметр «t» — это не что иное, как в момент времени t я получил «t-й кадр, и у меня есть записанная «t-я координата (cx, cy, cz)». Чтобы быть более конкретным, у меня есть 343 кадра видео. И пока я реализую документ по следующей ссылке: pages.cs.wisc .edu/~fliu/project/3dstab.htm, где автор использует программное обеспечение «Voodoo Camera Tracker», которое при вводе данных в виде набора кадров создает вывод, содержащий различные параметры камеры. Итак, у меня есть 343 значения параметра. И, взяв нестабильный путь камеры, мне нужно сделать подгонку lsq. - person a3.14_Infinity; 12.11.2010

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

person a3.14_Infinity    schedule 12.11.2010
comment
Лучше отредактировать свой вопрос и добавить ответ в ОБНОВЛЕНИЕ или что-то в этом роде, и обязательно принять ответ, который, по вашему мнению, помог больше всего (в данном случае их два, но просто примите лучший). Кроме того, отступ вашего кода на 4 пробела или выберите его и нажмите кнопку кода (1010), чтобы отформатировать его красиво. - person rubenvb; 12.11.2010