python - 如何在 Matlab 上找到稳定视频帧的旋转角度

标签 python matlab matrix image-rotation image-stabilization

考虑我有以下稳定的视频帧,其中稳定仅通过旋转和平移(无缩放)完成:

ori

如图所示,图像的右侧与之前的像素对称,即旋转后的黑色区域充满对称性。我添加了一条红线以更清楚地指示它。 red line

我想找到我稍后会用到的旋转角度。我本可以通过 SURF 或 SIFT 功能完成此操作,但是,在实际情况下,我不会拥有原始框架。

我可能可以通过蛮力找到角度,但我想知道是否有更好更优雅的解决方案。请注意,对称部分的强度值与原始部分并不完全相同。我已经检查了一些值,例如,键盘上 V 字符的右上角像素是 [51 49 47] 原始部分 但是[50 50 47]对称复制 中,这意味着不保证相应的像素是相同的 RGB 值。

我将在 Matlab 或 python 上实现它,视频稳定是使用 ffmpeg 完成的。

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

感谢任何帮助/建议,

最佳答案

一个像素(可能)位于搜索到的对称线上,如果

  • 其(first/second/thrid/...)左右点相等(=> dG,图1左)
  • 其(first/second/thrid/...)左(或右)值不同(=> 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

关于python - 如何在 Matlab 上找到稳定视频帧的旋转角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43286511/

相关文章:

python - 下载 Graphlab 依赖项的问题 get_dependencies()

r - 将堆叠矩阵转换为分块矩阵

matlab - 将矩阵因式分解为初等矩阵

python - 向 MySQL 表添加多个数组

python - 计算非空值 Pandas

Matlab 获取相关 p 值的方法

matlab - MATLAB 代码生成如何使用嵌套分支推断输出大小

c++矩阵重载不起作用

python - 使用 subprocess.Popen 重复命令

c - 为 Matlab 编译 C MEX 文件时 size_t 和 mwSize 之间的区别