smt*_*tsp 4 python matlab matrix image-rotation image-stabilization
考虑我有一个稳定的视频帧,其中稳定只通过旋转和平移(没有缩放):
如图所示,图像的右侧是先前像素的对称,即旋转后的黑色区域被对称填充.我添加了一条红线,表明它更清楚.

我想找到我稍后会使用的旋转角度.我可以通过SURF或SIFT功能完成此操作,但是,在实际情况下,我不会有原始帧.
我可能会通过蛮力找到角度,但我想知道是否有更好更优雅的解决方案.注意,对称部分的强度值与原始部分的精度值不完全相同.我已经检查了一些值,例如,V字的键盘上的右上像素是 [51 49 47]在原始部件而是[50 50 47]在对称拷贝,这意味着相应的像素不被保证是相同的RGB值.
我将在Matlab或python上实现它,并使用完成视频稳定ffmpeg.
编辑:我只有稳定的视频,无法访问原始视频或由ffmpeg生成的文件.
任何帮助/建议表示赞赏,
如果像素(可能)位于搜索的对称线上
dG,图1左)dGs,图1中)因此,兴趣点的特征是高值|dGs| - |dG|(=> dGs_dG,图1右)
从图1的右图可以看出,仍然存在许多误报.因此,Hough变换(左图2)将用于检测与最强线对应的所有点(图2右).绿线确实是搜索线.
调音
更改n:较高的值会丢弃更多的误报,但也会排除n边框像素.通过使用较低n的边框像素可以避免这种情况.
更改阈值:更高的阈值dGs_dG将丢弃更多的误报.dG丢弃高值也可能有趣的是丢弃原始图像中的边缘位置.
对称线的先验知识:使用霍夫变换的定义,您可以丢弃通过图像中心部分的所有线.
用于生成图像的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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
288 次 |
| 最近记录: |