Отрегулируйте ориентацию regionprops на 0-360 градусов (Matlab) - PullRequest
0 голосов
/ 09 июля 2020

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

Я использовал 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 

Любые предложения приветствуются. Спасибо!

...