Px4 flow分析
代码地址https://github.com/PX4/Flow
主要来分析最后一个函数compute flow
原版代码的光流算法主要是使用hist直方图算法,这段代码主要可以分成两部分来看,第一部分是生成直方图,第二部分是根据直方图来进行位移向量的计算。由于是光流,那么就是飞机底部的摄像头随时间移动的一个趋势,那么一定是需要至少两幅图的数据,分别为frame1和frame2 。
第一步的j、i的for循环是采样点的循环,之中的jj、ii的循环是对于一个小邻域的采样。采样点是从frame1找的,之后根据采样点的坐标在frame2的-winmin到winmin的一个小矩形种找一个最相似的点,简单来说,就是找到采样点在两幅图的对应位置。
PARAM_BOTTOM_FLOW_FEATURE_THRESHOLD变量来判断对于特征点采样的质量要求,越大越严苛。表示是否当前这个点可以作为计算光流的点。原函数计算了梯度等。
之后找第二张图中一个最相似的点,计算sad(sum
of absolute difference)也就是对于两张图的差异的绝对值的和进行计算,然后作为相似度的衡量,越小越相似。PARAM_BOTTOM_FLOW_VALUE_THRESHOLD则是对于相似度的一个阈值判断,越小越相似,越大越严苛,如果不满足这个条件,说明两张图片几乎找不到对应点,那么就没戏了,接着看下一个采样点吧。
如果很幸运,frame1中找到了可以计算的采样点,而且在frame2中也找到了对应的点,那么可以计算x和y方向的差值,或者说是一个移动向量,分别计算x和y两个方向的移动,这样就能够获得移动的向量,其中两个方向x和y移动的多少则记录在一个直方图的数组中。
所以最终x和y的直方图数组中记录的是所有挑战过两关的英雄点,记录移动的大小和方向。
以上是对于hist的产生,除了hist之外还有个东西,是对应点的移动的数据,也就是所有采样点的移动的方向和大小,dirs和subdirs,dirs记录的是像素级别的移动,subdirs记录的是亚像素级,也就是半个像素点的移动。
有了hist和dirs,那么用hist和dirs的数据代表原来的数据,就不用frame1和frame2了,可以光荣退役了,因为有了更能表示的一种方式——直方图和方向向量。
第一步是一个小参数的判断,是否filter,这个感觉影响不大,效果都差不多,不知道其他人是不是这样。
如果是PARAM_BOTTOM_FLOW_HIST_FILTER,那么就是对于hist的处理,如果不是,那么就是对于dirs和subdirs的计算,比较简单,简简单单的求和然后处以有效的采样点个数就可以了。
最后融合gyro的信息进行调整。
G106group
BUAASCSE
flow.c源代码:
https://github.com/PX4/Flow/blob/master/src/modules/flow/flow.c