Я хочу выровнять видеокадры по центру и переориентировать животное, идущее по кадрам. Я преобразовал каждый кадр в двоичную форму и подогнал к телу животного эллипс. Бинаризовано с подгонкой эллипса
Я использовал regionprops, чтобы найти эллипс, который выводит ориентацию от -90 до 90 градусов. Я поворачиваю каждый кадр в зависимости от разницы между ориентацией и желаемой ориентацией выравнивания. Проблема, с которой я сталкиваюсь, заключается в том, что иногда ориентация выравнивается по голове, а иногда и по хвосту, поэтому выравнивание иногда переворачивается на 180 градусов.
Вертикальное положение
Перевернутая позиция
Я думаю, что это можно решить, поместив вывод ориентации в пространство 0–360. У кого-нибудь есть решение для этого?
Вот мой код:
for i = 1000
frame = read(v,i);
BW = im2bw(frame,0.95);
imshowpair(frame,BW,'montage')
% Extract the maximum area
BW = imclearborder(BW);
BW = bwareafilt(BW,1);
% Calculate centroid, orientation and major/minor axis length of the ellipse
s = regionprops(BW,{'Centroid','Orientation','MajorAxisLength','MinorAxisLength'});
centroid(i,:) = s.Centroid;
orientation(i) = s.Orientation;
fixed_orientation(i) = s.Orientation;
delta_angle(i) = -90 - orientation(i);
if i >=2
if diff(sign( fixed_orientation(i-1:i) )) == 2 && abs(fixed_orientation(i-1))-abs(fixed_orientation(i))>=20
fixed_orientation(i) = -fixed_orientation(i);
delta_angle(i) = -(-90 - fixed_orientation(i));
end
end
% Calculate the ellipse line
theta = linspace(0,2*pi);
col = (s.MajorAxisLength/2)*cos(theta);
row = (s.MinorAxisLength/2)*sin(theta);
M = makehgtform('translate',[s.Centroid, 0],'zrotate',deg2rad(-1*s.Orientation));
D = M*[col;row;zeros(1,numel(row));ones(1,numel(row))];
% Visualize the result
figure
imshow(BW)
hold on
plot(D(1,:),D(2,:),'r','LineWidth',2)
end
figure
for i = 1:1000
rotate_filler = imrotate(read(v,i), delta_angle(i), 'crop');
rotated_image(:,:,:,i) = rotate_filler;
imshowpair(read(v,i), rotated_image(:,:,:,i), 'montage')
pause(0.001)
end
Любые предложения приветствуются. Спасибо!