Как найти угол поворота стабилизированного видеокадра на Matlab

Полагаю, что у меня есть стабилизированная видеокадра, где стабилизация осуществляется только вращением и переводом (без масштабирования):

ори

Как видно на изображении, правая сторона изображения симметрична для предыдущих пикселей, т. Е. Черная область после вращения заполняется симметрией . Я добавил красную линию, чтобы обозначить ее более четко. Красная линия

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

Я, вероятно, могу найти угол с помощью грубой силы, но мне интересно, есть ли лучшее и более элегантное решение. Заметим, что значение интенсивности симметричной части не точно совпадает с исходной частью. Я проверил некоторые значения, например, верхний правый пиксель символа V на клавиатуре [51 49 47] в оригинальной части, но [50 50 47] в симметричной копии, что означает, что соответствующие пиксели не гарантируют того же значения RGB ,

Я реализую это на Matlab или python, и стабилизация видео выполняется с помощью ffmpeg .

EDIT : У меня только стабилизированное видео, у меня нет доступа к оригинальному видео или файлам, созданным ffmpeg.

Любая помощь / предложение приветствуются,

Пиксель (вероятно) лежит на искомой линии симметрии, если

  • Его левая и правая точки (первая / вторая / третья / …) равны (=> dG , рис. 1 слева)
  • Его (первое / второе / thrid / …) значение слева (или справа) отличается (=> dGs , рис. 1 в середине)

Итак, представляющие интерес объекты характеризуются высокими значениями для |dGs| - |dG| |dGs| - |dG| (=> dGs_dG , рис. 1 справа)

Как видно на рисунке справа на рисунке 1, существует множество ложных срабатываний. Поэтому преобразование Хафа (рис. 2 слева) будет использоваться для обнаружения всех точек, соответствующих самой сильной линии (рис. 2 справа). Зеленая линия – действительно искомая линия.

настройка

  • Изменение n : более высокие значения будут отбрасывать больше ложных срабатываний, но также исключают n пограничных пикселей. Этого можно избежать, используя нижнее n для пограничных пикселей.

  • Изменение пороговых значений: более высокий порог на dGs_dG отбрасывает больше ложных срабатываний. Отбрасывание больших значений dG также может быть интересно отбросить края в исходном изображении.

  • Априорное знание линии симметрии: используя определение преобразования hough, вы можете отбросить все линии, проходящие через центральную часть изображения.

введите описание изображения здесь

введите описание изображения здесь

Для создания изображений используется код MATLAB:

 I = imread('bnuqb.png'); G = int16(rgb2gray(I)); n = 3; % use the first, second and third left/right point dG = int16(zeros(size(G) - [0 2*n+2])); dGs = int16(zeros(size(G) - [0 2*n+2])); for i=0:n dG = dG + abs(G(:, 1+ni:end-2-ni) - G(:, 3+n+i:end-n+i)); dGs = dGs + abs(G(:, 1+ni:end-2-ni) - G(:, 2+n:end-n-1)); end dGs_dG = dGs - dG; dGs_dG(dGs_dG < 0) = 0; figure subplot(1,3,1); imshow(dG, []) subplot(1,3,2); imshow(dGs, []) subplot(1,3,3); imshow(dGs_dG, []) BW = dGs_dG > 0; [H,theta,rho] = hough(BW); P = houghpeaks(H,1); lines = houghlines(BW,theta,rho,P,'FillGap',50000,'MinLength',7); figure subplot(1,2,1); imshow(H, []) hold on plot(P(:, 2),P(:, 1),'r.'); subplot(1,2,2); imshow(I(:, n+2:end-n-1, :)) hold on max_len = 0; for k = 1:length(lines) xy = [lines(k).point1; lines(k).point2]; plot(xy(:,1),xy(:,2),'g'); end 
Interesting Posts