关于光流法全面的介绍和OpenCV代码,请参考:zou\text{x}y09的专栏
http://blog.csdn.net/zou\text{x}y09/article/details/8683859
本文和后续文章仅对光流法的原理进行补充。上述参考文章里面已经介绍的内容不会重复。
OpenCV中calcOpticalFlowFarneback
cv::calcOpticalFlowFarneback(prevgray,
gray,
flow,
0.5, //double pyrScale金字塔参数:0.5为经典参数,每一层是下一层尺度的一半;
3, // int levels金字塔的层数
15, //int winsize窗口大小
3, // int iterations,迭代次数
5, //int polyN
1.2, //double polySigma
0); // int flags 可以组合使用OPTFLOW_USE_INITIAL_FLOW OPTFLOW_FARNEBACK_GAUSSIAN
用Gunnar Farneback 的算法计算稠密光流(即图像上所有像素点的光流都计算出来)。它的相关论文是:”Two-Frame Motion Estimation Based on PolynomialE\text{x}pansion”。
下面对原论文计算位移(即运动)的原理进行解读。
仅仅用相邻两帧图像来估计物体的运动,即估计物体的位移,位移场。
多项式展开指的是:对每个像素的领域使用一个多项式来近似表达。这里仅仅对二项式展开感兴趣。对每一个像素,位置为
其中
这些系数使用加权的最小二乘法拟合领域中信号的值。
位移估计
理想的情形:
对于第一副图像,构建一个局部信号:
在经历一个全局的位移
因此有
最关键的是(5)式:
值得注意的是,在任何维度下,上式是成立的。
实际情形:
很显然,我们使用一个不随空间变化的位移d,使用单一个多项式拟合函数来研究两副图像的关系,是不切实际的。
定义第一副图像随空间变化的参数
最主要的约束是:
注:(9)式对应于(4),显然必只用第一副图像的
(10)和(11)一起对应于(5)式。
使用先验证信息
位移比较大的时候,第一个多项式信号中的
本文在参考以下文章:
【1】 Gunnar Farneback 《Two-Frame Motion Estimation Based on PolynomialE\text{x}pansion》
【2】zouxy09的专栏 http://blog.csdn.net/zou\text{x}y09/article/details/8683859
【3】