Sunday 20 December 2015

OpenCV for secret agents - Motion amplifying camera

在007的电影中,Bond经常需要查看被隐藏的武器。通常他使用的x ray,红外线等仪器,但是这些仪器也很容易被其他间谍探测到。其实仅仅使用相机分析人的移动就能得到很多信息,比如某个人是不是在看一个方向,或者一条腿一直在动等等的肢体语言分析。我们可以把某种运动不断重复实现放大,就好比水面的波纹不断的扩散,这种方法叫做Eulerian video magnification.

Eulerian video magnification是基于Eulerian specification of the flow field。假设有一条河,Eulerian specificaiton描述了某个位置在某个时间的水流速度。这个速度在高山的泉水会快,在冬季的河口会慢,在河面会快,在河底会慢。我们可以用它来描述在某个位置,某个时间的物体运动。我们可以把不同时间和地点的运动叠加起来,达到强化运动的效果。

另外一种表达方式是Lagrangian specification,描述了某个物体在某段时间的位置,比如河里的一粒沙子肯呢过需要几年时间从山顶流到河口。它好比许多计算机视觉的程序,描述的是一个物体或者特征在一段时间内的移动。

FFT
我们通常用一段波形图来表示声音信号,波峰代表大声,波谷代表小声。在一段视频中,每一个像素也可以被看做是一个有起有落的波形。假设我们同时用相机和麦克风来记录一个节拍器,那么它发声的波形和指针在图像中运动的波形相一致。所以无论是声音还是图像都能用频率来描述。我们通过把图像转换到频域,选取特定的频率,再转换回来,保留想要看到的运动模式。

在原始的图像中运行FFT会很慢,而且这些频率对应在每个像素的运动,会有很多噪声,而且细节过多。因此我们把图像downsample,不过我们也希望保留对运动很重要的边缘。

可以用Gaussian filter进行downsampling,每个像素都是周围像素的加权平均,然后每隔一个像素去掉一个像素,这样每一帧的大小都是上一个图像的一半,就得到了Gaussian image pyramid。

为了保留边缘,我们用Laplacian image pyramid。在已经得到的Gaussian image pyramid中,我们选取第i+1层图像,通过复制像素值把它的大小扩大一倍,再使用Gaussian filter。我们把得到的图像和在Gaussian image pyramid第i层的图像相减,就得到了Laplacian image pyramid的第i层图像。所以Laplacian image pyramid中的图像就是一个模糊的,downsampled的图像和另外一个更加模糊的,经过两次downsample,一次upsample的图像的差值。

为啥这样就得到边缘了呢?边缘实际上是局部对比很大的特征,非边缘就是局部平滑的区域。如果我们把一个平滑区域变得模糊,它还是平滑的,所以和原来区域的差值为0.反之差值不为0,这样就能找到边缘。

我们不仅downsample FFT的输入,也upsample IFFT的输出,这样就可以得到和原始图像大小一样的图像。






No comments:

Post a Comment