Opencv - 如何区分抖动和平移?

时间:2013-06-13 14:01:53

标签: c++ opencv

我正在使用C ++中的Opencv处理视频稳定器
在项目的这个时候,我能够通过3种不同的技术(光流,相位相关,兴趣点上的BFMatcher)正确地找到两个连续帧之间的平移。
为了获得稳定的图像,我将所有平移向量(从连续帧)加到一个,在warpAffine函数中用于校正输出图像。

我在固定相机上取得了不错的效果但是在翻译中相机上的结果非常糟糕:图像从屏幕上消失。

我想我必须将我想要移除的抖动运动与我想要保留的平移运动区分开来。但我对其他解决方案持开放态度。

2 个答案:

答案 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)

我建议您采用可能的方法(按复杂度顺序):

  • 在应用稳定之前,在平移向量上应用一些易于实现的IIR低通滤波器。这将高频(抖动)与低频(平移)
  • 分开
  • 相同的想法,有点复杂,使用卡尔曼滤波来跟踪恒定速度或加速度的运动。你可以使用OpenCV的卡尔曼滤波器。
  • 有点棘手,在运动幅度上设置一个阈值来决定两种状态(移动与静态相机)并过滤或不过滤。
  • 最后,您可以使用机器学习中的一些精细技术来尝试识别用户所需的动作(静态,平移等),并过滤或不过滤用于稳定的运动矢量。

只是阈值不是低通滤波器。 可能的低通滤波器(易于实现):

  • 有众所周知的平均值,即已经是一个低通滤波器,其截止频率取决于进入平均方程的样本数量(截止频率越低,样本越多)。
  • 一个经常使用的过滤器是指数过滤器(因为它会以指数速率衰减忘记过去)。它仅使用x_filt(k) = a*x_nofilt(k) + (1-a)x_filt(k-1)计算为0 <= a <= 1
  • 另一种流行的过滤器(可以超过1阶计算)是Butterworth filter
  • Etc Low pass filters on WikipediaIIR filters ...