Как повернуть 2D теоретический путь, чтобы соответствовать или быть наложенным на путь из видеообработки - PullRequest
1 голос
/ 11 июля 2019

Я отслеживаю движение объекта из видеофайла в MATLAB и сохраняю местоположения из каждого кадра в массиве numberOfFrames x 2.

Я знаю теоретический путь или предполагаемый путь. При записи фильма камера находится под неизвестным углом в пространстве. Поэтому путь перекошен. Единственная информация, которую я имею, - это масштабирование между пикселями и миллиметрами с использованием диаметра объекта.

Теперь я хотел бы повернуть намеченную траекторию и перемещать ее, пока она не будет наложена на отслеживаемую траекторию движения.

Я начинаю с моего теоретического пути (Pth), затем поворачиваю его в 3-х измерениях до «Pthr». После этого я зацикливаюсь на каждой точке в «М». И для каждой точки в «М» я ищу ближайшую точку из «Pthr». Затем я повторяю для следующего пункта в «М». Это, вероятно, имеет проблему выбора одной и той же точки в «Pthr» для нескольких точек в «M».

Я заметил, что это чувствительно к моему первоначальному предположению и дает ужасные результаты.

Кроме того, М - не идеальный путь, так как это экспериментальные измерения, он далеко не идеален. измерено относительно теоретического не повернутого пути

% M = [Mx,My], is location in x and y, from motion tracking.
% scale = 20; % pixels/mm, using the size of object
% I build the theoretical path (Pth) goes from to (0,0,0) to (0,3,0) to
% (3,3,0) to (3,0,0) to be approximately the same length as M
Pthup = linspace(0,3,num)';
Pthdwn = linspace(3,0,num)';
Pth0 = zeros(size(Pthup));
Pth3 = 3*ones(size(Pthup));
% Pth is approximately same length as M
Pth = scale*[Pth0 Pthup Pth0;Pthup Pth3 Pth0;Pth3 Pthdwn Pth0];

% using fmincon in matlab to minimize the sum of the square
lb = [145 0 -45 min(min(M)) min(min(M))]; %upper bound
ub = [180 90 45  max(max(M)) max(max(M))]; %lower bound

coro = [180 0 0 mean(Mx) mean(My)]; %initial guess
% initial guess (theta(x),theta(y),theta(z), shift in x, shift in y)
cnt = 0; er = 1;
while (abs(er)>0.1)
    [const,fval] = fmincon(@(cor)findOrientation(cor,Pth,M),coro,[],[],[],[],lb,ub);
    er = sum(const-coro);
    coro = const;
    cnt = 1+cnt;
    if (cnt>50)
        cnt = cnt;
        break
    end
end

%% function findOrientation keeps rotating Pth until it is closest to M

function [Eo] = findOrientation(cor,Pth,M)
% cor = [angle of rotations, center coordinate];(degrees, non-dimensiolaized in pixels)
% M = measured coordinates from movie in pixel
% coor: is output of the form [x-coordiante,y-coordinate, absolute distance from Center(i,:)]
% F = sum of least square, sum(coor(:,3))

%% Rotation of theoretical path about z,y,x and shifting in it in xy
thx = cor(1); 
thy = cor(2);
thz = cor(3);
xy = cor([4:5]);
% T = [cosd(thn) -sind(thn);
%         sind(thn) cosd(thn)]; %rotation matrix in 3D
Tz = [cosd(thz) -sind(thz) 0;
        sind(thz) cosd(thz) 0;0 0 1]; %rotation matrix
Ty = [cosd(thy) 0 -sind(thy);0 1 0;
    sind(thy) 0 cosd(thy)]; %rotation matrix
Tx = [1 0 0;0 cosd(thx)  -sind(thx);
    0 sind(thx) cosd(thx)]; %rotation matrix

Pthr = zeros(size(Pth));
for i = 1:size(Pth,1)
    xp = Tz*Pth(i,:)';
    xp = Ty*xp;
    xp = Tx*xp;
    Pthr(i,:) = xp.';
end

Pthr = Pthr(:,[1,2]); % omit third value because it is 2D
Pthr = Pthr + [cor([4:5])]; 

rin = sqrt(Pthr(:,1).^2+Pthr(:,2).^2); %theoretical radius
Centern = sqrt(M(:,1).^2 + M(:,2).^2);%measured radius


for i = 1:size(M,1) %loop over each point in tracked motion
    sub = Pthr-M(i,:); %subtracting M(i,:) from all Pthr
    for j = 1:length(sub)
        dist(j,1) = norm(sub(j,:));% distance from M(i,:) to all ri
    end
    %index is based on the min absolute distance between Pthr and M(i,:). It chooses the closest Pthr to a specific M(i,:)
    [mn, index] = min(dist); 
    erri = abs(rin(index)-Centern(i))./rin(index);
    coor(i,:) = erri;
end

Eo = sum(coor);
...