如何在Matlab中找到一个稳定视频帧的旋转角度

4

假设我有一个稳定的视频帧,其中稳定是通过旋转和平移(没有缩放)完成的:

ori

如图所示,图像的右侧是前面像素的对称,即旋转后的黑色区域填充了对称性。我添加了一条红线以更清晰地指示它。 red line 我想找到旋转角度,以便以后使用。我可以通过SURF或SIFT特征来完成这个任务,但在实际情况下,我将没有原始帧。
我可能可以通过蛮力方法找到角度,但我想知道是否有更好、更优雅的解决方案。请注意,对称部分的强度值不完全与原始部分相同。我已经检查了一些数值,例如,键盘上V字符的右上像素在原始部分中为[51 49 47],而在对称副本中为[50 50 47],这意味着对应的像素不能保证具有相同的RGB值。
我将在Matlab或Python上实现这个项目,视频稳定使用ffmpeg完成。

编辑:我只有稳定的视频,无法访问原始视频或ffmpeg生成的文件。

非常感谢任何帮助/建议。


最好的方法是使用与ffmpeg相同的转换方式。我假设您正在使用VidStab插件来进行ffmpeg操作?如果是这样,您可能在过程中生成了一个“transforms.trf”文件。我建议您研究一下该文件的格式,并从中提取值。 - Aaron
@Aaron 我应该提到我只有稳定化的视频。现在已经更新了问题。我正在使用deshake插件,我使用的命令是ffmpeg.exe -i infile -vf deshake -c:v libx264 -crf 0 -preset veryslow outfile - smttsp
1个回答

6

如果像素(可能)位于搜索的对称线上,则其(第一个/第二个/第三个/...)左右点相等(=> dG,图1左),或者其(第一个/第二个/第三个/...)左(或右)值不同(=> dGs,图1中)。

因此,感兴趣的点的特征是|dGs| - |dG|的高值(=> dGs_dG,图1右)。

如图1右侧的图像所示,仍存在许多误报。因此,将使用霍夫变换(图2左)来检测与最强线相对应的所有点(图2右)。绿色线确实是所搜索的线。

调整

  • 更改n:较高的值会丢弃更多的误报,但也会排除n个边界像素。可以通过为边界像素使用较低的n来避免这种情况。

  • 更改阈值:对dGs_dG的较高阈值会丢弃更多的误报。丢弃dG的高值也可能有助于丢弃原始图像中的边缘位置。

  • 对对称线的先验知识:使用霍夫变换的定义,可以丢弃所有通过图像中心部分的线。

enter image description here

enter image description here

用于生成这些图像的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+n-i:end-2-n-i) - G(:, 3+n+i:end-n+i));
  dGs = dGs + abs(G(:, 1+n-i:end-2-n-i) - 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

谢谢提供代码。很不幸,它在很多情况下都不能正常工作 :( 而且在许多情况下它接近但不是非常准确。https://www.dropbox.com/s/dontiwcwrj4lwwy/img55.PNG?dl=0和https://www.dropbox.com/s/zr0tv2m4i0od911/img125.PNG?dl=0。但在某些情况下它完美地工作。我认为,假设对称性不在图像中心可能会提高性能。但有没有办法最小化我分享的图像边缘对它们的影响?它们肯定会增加误报。 - smttsp
另外,在以下两张图片中,它并不完全准确。https://www.dropbox.com/s/vt5mmt4wss0tog4/img4a.PNG?dl=0 是原始图像,其缩放版本为 https://www.dropbox.com/s/dff1hprvzoxmq1n/img4b.PNG?dl=0。在缩放图像的右侧边缘附近的文件夹附近,有10个像素的偏移量。我增加了 n,但仍然没有变化。 - smttsp
我添加了一些调整选项,特别是在霍夫变换中丢弃一些区域并对dG应用阈值可能会很有趣。 - m7913d
请注意,增加 n 还会丢弃更多的边缘像素。可以通过按编辑后的帖子所指出的更改算法来避免这种情况。我目前没有克服不准确性的想法。也许可以进行一些后处理,使线条稍微适应于 dGs_dG 的高值,以更好地重合?你确定对称线应该是直线吗? - m7913d
我同意 n。但是我认为将其增加1-2可能会更好一些。我认为线条应该是直的,因为旋转是全局的,所以我不认为它不应该是直的。(另外,我没有看到任何“不直”的线条)。 - smttsp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接