最近用QT + OPENCV 实现了光流检测;
关于calcOpticalFlowPyrLK的函数的介绍,网上不绝于耳,很多大牛都在介绍,我也借花献佛再次show一下。
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,不知是指的哪一个)
说完这个,估计没啥意思,只有实际上用了才知道,如何使用才是关键,下面就是我在实际用的时候的一些见解:
calcOpticalFlowPyrLK(gray_pre, gray, gray_point_pre, gray_point_cur,status,err,Size(25,25));
----解释:gray_pre:前一帧图gray:当前帧图gray_point_pre:前一帧点数据gray_point_cur:当前帧点数据status:返回状态err:返回的errSize(25,25):检测大小
-----------------------------------------
其实核心的东东就是传入gray_pre,gray,gray_point_pre,size等,只需要处理返回来的gray_point_cur内检测数据即可;
解释了这么多,不如来张图片比较实际,如下图所示: