我需要检测摄像机平移的速度(水平/垂直),以警告操作员放慢速度。

整个图像都像块一样移动,我不需要实际方向(尽管H或V会是一个奖励),而我只需要一个大概的幅度-即。如果在各帧之间移动了超过'N'个像素,则会触发。

图像较大且通常是均匀的低对比度场景,我没有任何明显的高光要跟踪。我需要实时(60fps)且不使用所有CPU。向左/向右/向上/向下移动一个像素,重复-查找最小值。

我想知道是否有一个更智能的解决方案?

#1 楼

如果您正在寻找一种简单的方法,可能是应用标准的运动估计算法,该算法在MPEG类压缩编解码器中已经非常成熟。它们很容易理解,我想您将可以使用很多代码。该算法逐块生成运动矢量-然后您可以找到最突出的簇,并取平均运动矢量的方向和大小。

MPEG4-还有另一个关键概念,称为“全局运动补偿”,该技术试图首先估计并补偿摄像机的运动和平移。这样做的好处是,根据复杂性,这些方法可以更简单或更详尽。这是一个示例文件,另一示例文件与此相同。

一般来说,摄像机平移和运动估计是一个已建立的研究领域。这里是参考:纸和另一种纸。

关于这个问题。您会发现严谨,准确的算法以及简单快速的算法。

评论


$ \ begingroup $
如果我可以方便地使用MPEG库,那我记得Mpeg的GMC受到了批评。由于相机稳定算法,我认为这将是一个常见的领域
$ \ endgroup $
–马丁·贝克特(Martin Beckett)
2012年3月31日14:34

$ \ begingroup $
您绝对可以挂钩(或提取)MPEG算法。您可以将FFMPEG用作库并提取出来-但可能会有些棘手。或者,您可以阅读完整的MSSG代码以进行提取。
$ \ endgroup $
– Dipan Mehta
2012年3月31日14:40

$ \ begingroup $
关于对GMC的批评-大大降低比特率并创建基于对象的编码实在是不言而喻。但是,估计摄像机运动参数并不难。
$ \ endgroup $
– Dipan Mehta
2012年3月31日14:41

$ \ begingroup $
谢谢,我将看一下MSSG。我使用ffmpeg,但这不是一个简单的库,只能将其取出来!
$ \ endgroup $
–马丁·贝克特(Martin Beckett)
2012年3月31日14:54

#2 楼

这可能是一个很慢的解决方案,但是您可以对后续帧进行基于FFT的互相关,然后找到峰值以识别帧之间的偏移。也许只在图像的一小部分上执行此操作以节省处理器周期。

它不能与旋转或从一帧到下一帧的剧烈场景更改一起使用,并且可能有更好的方法。这是一种“我有锤子,所以一切看上去都像钉子”的解决方案。我想这就像您的幼稚解决方案一样,除了不需要边缘检测并且FFT使它比一次显式移动一个像素快得多。

这个问题是相似的,没有人提出互相关以外的任何建议,所以也许还不错:使用MATLAB计算连续图像之间的偏移量

评论


$ \ begingroup $
谢谢,很容易假设FFT慢,但是我可以做一个2 ^ n的小窗口。 ps。仅用于搜索stackoverflow.com/questions/1100100/…
$ \ endgroup $
–马丁·贝克特(Martin Beckett)
2012年3月31日下午3:40

#3 楼

您可以估算速度和方向的一种方法是进行“局部”流量估算,例如图像中心的四个窗口。 Lucas–Kanade微分方法假定位移近似恒定,因此可以作为方程求解。

因此,我的循序渐进指南将是:


在图像中心获取一个像素窗口,例如20x20
计算Ix和Iy梯度。
将梯度窗口分为四个部分,例如4x10x10。
与下一帧求解四个线性最小二乘方程。
对四个速度矢量求平均值。

这确定方向和速度,但是您可以使用加权窗口使它更强大。查看Lucas-Kanade方法的扩展。

#4 楼

我认为互相关是找到偏移量的一种好方法,但是如果您想真正快速地进行偏移,则可以尝试将其限制为仅一条垂直扫描线和一条水平扫描线(即穿过图像中心)。计算两个帧中扫描线之间的互相关性应该可以使您获得水平和垂直偏移的近似值。

评论


$ \ begingroup $
这可能有用,但是如果对角平移,即使横向平移只是上下晃动,也无法正常工作。我认为图像中心的矩形子区域会更好。
$ \ endgroup $
– Endolith
2012年4月4日,0:55