1、optical flow (光流) 表示的是相邻两帧图像中每个像素的运动速度和运动方向。第t帧的时候A点的位置是(x1, y1),那么我们在第t+1帧的时候再找到A点(能在下一帧中找到A点,就需要用到计算光流的各种方法,在openCI中可以实现),假如它的位置是(x2,y2),那么我们就可以确定A点的运动了:(ux, vy) = (x2, y2) - (x1,y1)
然后将多个光流图进行累加,就能表示物体的运动轨迹,我自己是把它理解为像是在慢快门下拍车流形成的图(当然,我不知道这样理解是否正确)
2、关于光流图是否是灰度图像,查阅相关资料后我的结论是,光流图是灰度图像,可以将从光流图转换成彩色图进行显示。在一篇博客(http://bbs.elecfans.com/jishu_485979_1_1.html)中说,“光流场是图片中每个像素都有一个x方向和y方向的位移,所以在上面那些光流计算结束后得到的光流flow是个和原来图像大小相等的双通道图像”
(这是Two-Stream Convolutional Networks for Action Recognition in Videos论文中显示的x,y通道图像)
而在例如用openCI中的“calcOpticalFlowFarneback来计算稠密光流并且用孟塞尔颜色系统来显示的结果图中,不同颜色表示不同的运动方向,深浅就表示运动的快慢了”
3、光流法的大致流程如下(原文地址:http://www.cnblogs.com/easymind223/archive/2012/12/30/2839480.html):
①在一帧图像中选取大量的光流点(具体选取方法可以不同,如fast角点,随机选,等间隔选...)。
②计算所有光流点的运动矢量(常用方法有LK光流,HS光流等)。
③根据这些矢量和其它一些特征检测运动目标。
具体如下:1.首先在一帧图像内随机均匀选取k个点,并滤除那些邻域纹理太光滑的点,因为这些点不利于计算光流 2.计算这些点与上一帧图像的光流矢量,如上右图,此时已经可以看出背景运动的大概方向了 3.接下来的这一步方法因人而异了。2007年cvpr的一篇文章Detection and segmentation of moving objects in highly dynamic scenes的方法是把这些光流点的(x, y, dx, dy, Y, U, V)7个特征通过meanshift聚类来聚合到一起,最后形成运动目标轮廓。而我的方法很简单,只用到了(dx, dy)两个特征,如左图,首先把所有光流点投射到直角坐标,图中的坐标轴是(dx,dy), 然后通过meanshift找到密度最大的(dx, dy)坐标点,也就是背景矢量最集中的位置(图中点的亮度越大代表该位置矢量的密度越大),如红圈所示,红圈外面的矢量就可以认为是运动目标了,如右图所示。