OpenCV之稠密光流

介绍
参考链接
在OpenCV中,光流分为稀疏光流和稠密光流,关于稀疏光流可以参考之前的文章
OpenCV之光流
稠密光流的解释,可以参考OpenCV官方文档
OpenCV提供了另一种算法来寻找密集的光流。它计算帧中所有点的光流。它基于Gunner Farneback的算法,该算法在Gunner法尔内巴克2003年的“基于多项式展开的双帧运动估计”中进行了解释。
其实稀疏光流和稠密光流的区别,见名知义,稀疏光流是跟踪部分点,而稠密光流跟踪的是全部的点。所以相对来说,稠密光流的计算量会多一点。
实现
OpenCV中的API如下:
1 | void cv::calcOpticalFlowFarneback( |
参数解释
- prev,前一帧8位单通道输入图像
- next,当前帧图像,大小和类型与prev相同
- flow,输出流图像,其大prev相同,类型为CV_32FC2
- pyr_scale,指定为每个图像构建金字塔的图像比例(</1),pyr_scale=0.5表示经典金字塔,其中每一个下一层都比上一层小两倍
- levels,金字塔层数(包括初始图像); levels = 1意味着不会创建额外的图层,只会使用原始图像
- winsize,平均窗口大小;较大的值提高了算法对图像的鲁棒性,并可以检测更快速的运动,但会产生更模糊的运动场
- iterations,每个金字塔等级上执行迭代算法的迭代次数。用于在每个像素中查找多项式展开的像素邻域;
- poly_n,用于在每个像素中找到多项式展开的像素邻域的大小;较大的值意味着图像将近似于更平滑的表面,从而产生更多鲁棒算法和更模糊的运动场,通常poly_n=5或7
- poly_sigma,于平滑导数的高斯的标准偏差,用作多项式展开的基础;对于poly_n = 5,可以设置poly_sigma = 1.1,对于poly_n = 7,可以设置poly_sigma = 1.5;
- flags,操作标志,可取计算方法有:
OPTFLOW_USE_INITIAL_FLOW 使用输入流作为初始流近似。
OPTFLOW_FARNEBACK_GAUSSIAN 使用Gaussian winsize×winsiz过滤器代替光流估计的相同大小的盒子过滤器;通常情况下,这个选项可以比使用箱式过滤器提供更精确的流量,代价是速度更低;通常,应将高斯窗口的胜利设置为更大的值以实现相同的稳健性水平。
代码例子
官方例子,计算得到一个具有光流矢量(u,v)的双通道阵列。我们找到了它们的大小和方向。我们对结果进行颜色编码,以便更好地可视化。方向对应于图像的色调值。幅值对应于“值”平面。
1 |
|
运行截图