光流法

来源:互联网 发布:淘宝网中老年春秋女装 编辑:程序博客网 时间:2024/05/30 04:20

1. 概念
首先什么是光流,在空间中,运动用运动场描述,但是如何能通过二维的图像平面获知物体的运动情况呢?我们知道一张图像,由三维空间投影而来,上面的每一个 点都有相应的强度值(intensity value),而物体的运动则是通过图像序列中强度的变化来描述的,空间中的运动场转移到图像上就表现为光流场.

还是不好理解吗?没事,先来看几个方程
2. 光流约束方程
我们首先假设空间亮度为常数(brightness constancy),能得到如下方程:
/frac{dI(x(t),y(t),t)}{dt}=0 (1)
用链式法则展开
=>;
/frac{/partial{I}}{/partial{x}}/frac{dx}{dt}+/frac{/partial{I}} {/partial{y}}/frac{dy}{dt}+/frac{dI}{dt}=0 (2)
=>;
I_x/cdot{u_x}+I_y/cdot{u_y}+I_t=0 (3) ——光流约束方程

I_x,I_y表示图像平面相对x,y轴方向的光强变化(同一张图上相邻 像素点),I_t表示同一个像素点在相邻时刻的强度变化(连续图像上同一个像素点),/vec{u}=(u_x ~ u_y)^T, 这里的/vec {u}即是光流。学术一点就是光流是能表征一个连续图像强度变化的方向以及幅度的向量场,也可以理解成是带有 灰度的像素点在图像平面运动产生的瞬时速度场。
当然如果你喜欢,也可以用Taylor series expansion求得光流约束方程:

I(x+/delta{x},y+/delta{y},t+/delta{t})=I(x,y,t)+/frac{/partial{I}}{/partial{x}}/delta{x}+/frac{/partial{I}}{/partial{y}}/delta{y}+/frac{dI}{dt}/delta{t}+HighOrderTerm

利用光度不变,再约等一下,也能得到光流约束方程,注意这边的时间间隔是/delta{t},偏移为/delta{x}
--------------------------------
现在来理解一下这个(1)式,或者说理解一下什么叫亮度不变呢,我们可以假设在空间中移动的物体上有一个点(x,y),经过一段时间,该点在图像平面上的 位置移动到了(x+/delta{x},y+/delta{y}),那亮度为常数的意思就是说,不管这个点移动到哪个位置,它的强度总是不变的,所以我们有I(x,y)=I(x+/delta{x},y+/delta{y}) 或是I(x(t),y(t))=C(其中x(t),y(t)始 终代表原物体上(x,y),只是经过一定时间,在图像上的位置发生了变化), 又或者是 /frac{dI(x(t),y(t),t)}{dt}=0 三个表达一个意思。
好了,从以上第一种表述brightness constancy的式子中,你有没有一些感觉?
我是这么理解的,那就是光流法的目的是跟踪目标(feature tracking),即由(x,y)确定的物体上的某个点,我们需要跟踪经过/delta{t}时间后它在图像上的位置,那,怎么跟踪呢?设 t 时刻图像为image_A,经过/delta{t}时间的图像为image_B,好了,前面说过同一 点亮度不变,那么这个点在t+/delta{t}时候所在image_B上x+/delta{x},y+/delta{y}处的亮度值必定等于 t 时刻image_A上(x,y)处的亮度值,即I(x,y,t)=I(x+/delta{x},y+/delta{y},t+/delta{t}),那 要得到x+/delta{x},y+/delta{y} 就必须先求出/delta{x},/delta{y},而这 个/frac{/delta{x}}{/delta{t}},/frac{/delta{y}}{/delta{t}}即是光流,至于怎么求,以后再唠。总结一下,我们现在就是利用原始图像中interest point所在位置x,y,以及brightness constancy这个假设的条件去估计出x+/delta{x},y+/delta{y},即计算出原来这个特征点跑哪里去了,这时候如果再配合帧率,那特征点移动的速度也就能求出来了。

3. 代码实现
以下是取自stanford光流课程的代码,注释我简单解释了一下,文后有附代码下载,里面是原文注释,有兴趣的朋友可以下载。这个例子的目的是让刚接触 光流法的朋友能有一个感性的认识,以后的文章会对算法进行详细的解释。

(略)

  • stanford作者源码以及所用的视频文件可以在下面网址找到:
    http://ai.stanford.edu/~dstavens/cs223b/
  • 修 改后的源码(操作摄像头):optical_flow_demo_edited.cpp
  • 另 外在/你opencv安装的位置/samples/c/lkdemo.c,这个demo没事你也可以瞄一下。

    最后再罗嗦一句,编译方法如 下:

    $gcc -o optical_flow_demo_edited optical_flow_demo_edited.cpp `pkg-config opencv --libs --cflags opencv`

    如 若转载,恳请注明:转载自 yaoyi 大白的博客 http://www.linyaoyi.com
    -----------------------to be continue----



转自:http://blog.yaoe.org/2010/01/%E5%85%89%E6%B5%81%E6%B3%95 %E4%B9%8B%E5%A7%8B%E8%A7%A3%E7%AF%87/

原创粉丝点击