OpenCV 光流

一、概述

       稠密光流:将图像中的每个像素都与速度关联。该光流可以用Horm-Schunck方法计算。实际上计算稠密光流并不容易。稠密光流的方法需要使用某种插值方法在比较容易跟踪的像素之间进行插值以解决那些运动不明确的像素,从中可以清楚地看到稠密光流相当大的计算量。

      稀疏光流的计算需要在被跟踪之前指定一组点。如果这些点具有某种明显的特性,例如角点,那么跟踪就会相对稳定和可靠。

二、Lucas-Kanade方法

       Lucas-Kanade算法(LK)最初用于求稠密光流。由于算法易于应用在输入图像中的一组点上,其后来为求稀疏光流的一种重要的方法。LK算法只需要每个感兴趣点周围小窗口的局部信息,所以它可以应用于稀疏内容。但是,使用小窗口的LK算法纯在不足之处,较大的运动会将点移除这个小窗口,而造成算法的无法再找到这些点。金字塔的LK算法可以解决该问题,即从图像金字塔的最高层(细节最少)开始向金字塔的底层(丰富的细节)进行跟踪。跟踪图像金字塔允许小窗口捕获较大的运动。

 Lucas-Kanade算法原理:

(1)亮度恒定。图像场景中目标的像素在帧间运动时外观上保持不变。

(2)时间连续或者运动是“小运动”。图像的运动随时间的变化比较缓慢。

(3)空间一致。一个场景中同一表面上邻近的点具有相似的运动,在图像平面上的投影也在邻近区域。

三、金字塔光流

       金字塔光流具体算法:在图像金字塔的最高层计算光流,用得到的运动计算结果作为下一层金字塔的起始点,重复这个过程直到到达金字塔的最底层。这样就将不满足运动假设的可能性降到最小从而实现对更快更长的运动的跟踪。实现金字塔Lucas-Kanade光流的函数是cvCalcOpticalFlowPyrLK( )。

四、相关函数

1、非金字塔的Lucas-Kanade稠密光流算法

void cvCalcOpticalFlowLK( const CvArr* prev, const CvArr* curr, CvSize win_size, CvArr* velx, CvArr* vely );
prev
     第一幅图像, 8-比特, 单通道.
curr
    第二幅图像, 8-比特, 单通道.
win_size 
   用来归类象素的平均窗口尺寸(Size of the averaging window used for grouping pixels)
velx
   光流的水平部分,与输入图像大小一样, 32-比特, 浮点数, 单通道.
vely 
  光流的垂直部分,与 输入图像大小一样, 32-比特, 浮点数, 单通道.
函数 cvCalcOpticalFlowLK 为输入图像的每一个象素计算光流,使用 Lucas & Kanade 算法

 

2、金字塔Lucas-Kanade光流

void cvCalcOpticalFlowPyrLK( const CvArr* prev, const CvArr* curr, CvArr* prev_pyr, CvArr* curr_pyr,
                                                 const CvPoint2D32f* prev_features, CvPoint2D32f* curr_features,
                                                 int count, CvSize win_size, int level, char* status,
                                                 float* track_error, CvTermCriteria criteria, int flags );
prev
     在时间 t 的第一帧
curr 
     在时间 t + dt 的第二帧
prev_pyr
     第一帧的金字塔缓存. 如果指针非 NULL , 则缓存必须有足够的空间来存储金字塔从层 1 到层 #level 的内容。尺寸 (image_width+8)*image_height/3 比特足够了
curr_pyr
     与 prev_pyr 类似, 用于第二帧
prev_features
     需要发现光流的点集
curr_features
     包含新计算出来的位置的 点集
count
     特征点的数目
win_size
     每个金字塔层的搜索窗口尺寸
level
     最大的金字塔层数。如果为 0 , 不使用金字塔 (即金字塔为单层), 如果为 1 , 使用两层,下面依次类推。
status
     数组。如果对应特征的光流被发现,数组中的每一个元素都被设置为 1, 否则设置为 0。
error
     双精度数组,包含原始图像碎片与移动点之间的差。为可选参数,可以是 NULL .
criteria
     准则,指定在每个金字塔层,为某点寻找光流的迭代过程的终止条件。
flags 
    其它选项:
CV_LKFLOW_PYR_A_READY , 在调用之前,先计算第一帧的金字塔
CV_LKFLOW_PYR_B_READY , 在调用之前,先计算第二帧的金字塔
CV_LKFLOW_INITIAL_GUESSES , 在调用之前,数组 B 包含特征的初始坐标 (Hunnish: 在本节中没有出现数组 B,不知是指的哪一个)
        函数 cvCalcOpticalFlowPyrLK 实现了金字塔中 Lucas-Kanade 光流计算的稀疏迭代版本 ([Bouguet00])。 它根据给出的前一帧特征点坐标计算当前视频帧上的特征点坐标。 函数寻找具有子象素精度的坐标值。
       两个参数 prev_pyr 和 curr_pyr 都遵循下列规则: 如果图像指针为 0, 函数在内部为其分配缓存空间,计算金字塔,然后再处理过后释放缓存。 否则,函数计算金字塔且存储它到缓存中,除非设置标识 CV_LKFLOW_PYR_A[B]_READY 。 图像应该足够大以便能够容纳 Gaussian 金字塔数据。 调用函数以后,金字塔被计算而且相应图像的标识也被设置,为下一次调用准备就绪 (比如:对除了第一个图像的所有图像序列,标识 CV_LKFLOW_PYR_A_READY 被设置).

      这个计算光流的函数使用了“易于跟踪的特征点”并返回每个点被跟踪的情况。


 

 

 

 

 

 

 

 

 

 

 

 

 




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值