2016.2.27 Px4 flow分析

时间:2021-09-17 18:37:06

Px4 flow分析

代码地址https://github.com/PX4/Flow

主要来分析最后一个函数compute flow

 

原版代码的光流算法主要是使用hist直方图算法,这段代码主要可以分成两部分来看,第一部分是生成直方图,第二部分是根据直方图来进行位移向量的计算。由于是光流,那么就是飞机底部的摄像头随时间移动的一个趋势,那么一定是需要至少两幅图的数据,分别为frame1frame2

 

第一步的jifor循环是采样点的循环,之中的jjii的循环是对于一个小邻域的采样。采样点是从frame1找的,之后根据采样点的坐标在frame2的-winminwinmin的一个小矩形种找一个最相似的点,简单来说,就是找到采样点在两幅图的对应位置。

PARAM_BOTTOM_FLOW_FEATURE_THRESHOLD变量来判断对于特征点采样的质量要求,越大越严苛。表示是否当前这个点可以作为计算光流的点。原函数计算了梯度等。

之后找第二张图中一个最相似的点,计算sad(sum of absolute difference)也就是对于两张图的差异的绝对值的和进行计算,然后作为相似度的衡量,越小越相似。PARAM_BOTTOM_FLOW_VALUE_THRESHOLD则是对于相似度的一个阈值判断,越小越相似,越大越严苛,如果不满足这个条件,说明两张图片几乎找不到对应点,那么就没戏了,接着看下一个采样点吧。

如果很幸运,frame1中找到了可以计算的采样点,而且在frame2中也找到了对应的点,那么可以计算xy方向的差值,或者说是一个移动向量,分别计算xy两个方向的移动,这样就能够获得移动的向量,其中两个方向xy移动的多少则记录在一个直方图的数组中。

所以最终xy的直方图数组中记录的是所有挑战过两关的英雄点,记录移动的大小和方向。

 

以上是对于hist的产生,除了hist之外还有个东西,是对应点的移动的数据,也就是所有采样点的移动的方向和大小,dirssubdirsdirs记录的是像素级别的移动,subdirs记录的是亚像素级,也就是半个像素点的移动。

 

有了histdirs,那么用histdirs的数据代表原来的数据,就不用frame1frame2了,可以光荣退役了,因为有了更能表示的一种方式——直方图和方向向量。

第一步是一个小参数的判断,是否filter,这个感觉影响不大,效果都差不多,不知道其他人是不是这样。

如果是PARAM_BOTTOM_FLOW_HIST_FILTER,那么就是对于hist的处理,如果不是,那么就是对于dirssubdirs的计算,比较简单,简简单单的求和然后处以有效的采样点个数就可以了。

最后融合gyro的信息进行调整。

 

                                                                      G106group BUAASCSE

 

flow.c源代码:

https://github.com/PX4/Flow/blob/master/src/modules/flow/flow.c