光流法原理
运动场: 物体在三维真实世界中的运动;
光流场: 运动场在二维图像平面上的投影。
给图像中的每个像素点赋予一个速度矢量,这样就形成了一个运动矢量场。在某一特定时刻,图像上的点与三维物体上的点一一对应,这种对应关系可以通过投影来计算得到。根据各个像素点的速度矢量特征,可以对图像进行动态分析。如果图像中没有运动目标,则光流矢量在整个图像区域是连续变化的。当图像中有运动物体时,目标和背景存在着相对运动。运动物体所形成的速度矢量必然和背景的速度矢量有所不同,如此便可以计算出运动物体的位置。需要提醒的是,利用光流法进行运动物体检测时,计算量较大,无法保证实时性和实用性。
通常情况下运动物体为图像前景, 静止部分为图像背景, 因此, 可以使用光流法比较方便地区分图像的前景和背景.
CalcOpticalFlowFarneback函数
OpenCV
提供了CalcOpticalFlowFarneback
函数用于计算光流. 具体地是基于Gunnar Farneback的算法计算全局性的稠密光流算法.
算法包含以下参数:
1 | # C++ |
参数 | 含义 |
---|---|
prevImg | 输入前一帧图像 |
nextImg | 输入后一帧图像 |
flow | 输出的光流 |
pyr_scale | 金字塔上下两层之间的尺度关系 |
levels | 金字塔层数 |
winsize | 均值窗口大小,越大越能denoise并且能够检测快速移动目标,但会引起模糊运动区域 |
iterations | 迭代次数 |
poly_n | 像素领域大小,一般为5,7等 |
poly_sigma | 高斯标注差,一般为1-1.5 |
flags | 计算方法, 主要包括OPTFLOW_USE_INITIAL_FLOW和OPTFLOW_FARNEBACK_GAUSSIAN |
CalcOpticalFlowFarneback
函数的功能就是计算图像中每个像素的光流,使得
从而计算出相邻帧之间物体的运动信息.
程序代码
1 | #! /usr/local/bin/python |
运行效果
可以看出运动前景基本被标识出来,但有一些背景中的部分也被误判为前景,需要进一步改进