我正在使用C ++中的Opencv处理视频稳定器。
在项目的这个时候,我能够通过3种不同的技术(光流,相位相关,兴趣点上的BFMatcher)正确地找到两个连续帧之间的平移。
为了获得稳定的图像,我将所有平移向量(从连续帧)加到一个,在warpAffine
函数中用于校正输出图像。
我在固定相机上取得了不错的效果但是在翻译中相机上的结果非常糟糕:图像从屏幕上消失。
我想我必须将我想要移除的抖动运动与我想要保留的平移运动区分开来。但我对其他解决方案持开放态度。
答案 0 :(得分:1)
实际上整个问题比你在开始时想象的要复杂得多。让我们这样看:当你将相机移动到世界时,靠近相机移动的东西移动得比背景中的移动得快 - 所以不同深度的物体会改变它们的相对距离(在移动头部时看看你的发现者)并看看它如何指向不同的东西)。这意味着图像实际上是变换的,不仅仅是翻译(在x或y中移动) - 所以你想如何为此做好准备呢?你需要做的是推断相机移动了多少(沿x,y和z平移)以及它旋转了多少(用偏航,平移和倾斜的角度)。这不是一项非常简单的任务,但openCV附带了一个非常好的包:http://opencv.willowgarage.com/documentation/camera_calibration_and_3d_reconstruction.html
因此,我建议您尽可能多地阅读Homography(http://en.wikipedia.org/wiki/Homography),相机模型和校准,然后再考虑您实际想要稳定的内容,如果仅适用于旋转角度,则任务是比你想要稳定转化的紧张情绪要简单得多。
如果你不想看中并忽略第三个维度,我建议你对光流进行平均,对其进行高通滤波,并通过图像平移到相反方向来补偿这种运动。这将使您的图像或多或少地保持在帧的中间,并且只会消除小的,快速的变化。
答案 1 :(得分:0)
我建议您采用可能的方法(按复杂度顺序):
只是阈值不是低通滤波器。 可能的低通滤波器(易于实现):
x_filt(k) = a*x_nofilt(k) + (1-a)x_filt(k-1)
计算为0 <= a <= 1
。