原文:Pyramidal Implementation of theLucas Kanade Feature Tracker Description of the algorithm 1
理清了LK算法的来龙去脉,下面我们来仔细的阅读一下源代码,opencv\sources\modules\video\src\lkpyramid.cpp
1.
void cv::calcOpticalFlowPyrLK( InputArray _prevImg, InputArray _nextImg,
InputArray _prevPts, InputOutputArray _nextPts,
OutputArray _status, OutputArray _err,
Size winSize, int maxLevel,
TermCriteria criteria,
int flags, double minEigThreshold )
{
Ptr optflow = cv::SparsePyrLKOpticalFlow::create(winSize,maxLevel,criteria,flags,minEigThreshold);
optflow->calc(_prevImg,_nextImg,_prevPts,_nextPts,_status,_err);
}
找到调用的calcOpticalFlowPyrLK(…)函数实现方式,创建稀疏金字塔LK光流类的对象,并调用其上的calc函数
3. SparsePyrLKOpticalFlow类:对于一个稀疏特征集,可以使用金字塔式的迭代LK算法来计算光流
4. 对于calc方法,一开始就是一系列的OpenCL代码,关键的是首先调用了ocl_calcOpticalFlowPyrLK(…)
诶,现在编码能力还不够,,还看不懂,,并没有发现论文中出现的算法,,, !!
即使这样,继续,虽然还是大部分看不懂,但是在该函数的返回值处,看到了希望!
return sparse(_prevImg.getUMat(), _nextImg.getUMat(), _prevPts.getUMat(), umatNextPts, umatStatus, umatErr);
在这个函数中,开始了真正的金字塔创建等内
5. sparse(…)
首先创建两个图像金字塔。
// build the image pyramids
std::vector prevPyr; prevPyr.resize(maxLevel + 1);
std::vector nextPyr; nextPyr.resize(maxLevel + 1);
继续跟踪next_points, status两个变量的状态,后续发现调用了下述函数,且传入的是引用,可以直接对下述变量直接进行修改
bool lkSparse_run(UMat &I, UMat &J, const UMat &prevPts, UMat &nextPts, UMat &status, UMat& err,
int ptcount, int level)
在这个函数中,就是创建一个ocl::Kernel kernel对象,为其设置各个所需要的参数,返回时执行kernel::run(…)
接下来就是妥妥的全是模板了,,,
诶,还是太菜了,,,待我再好好学学,回来填坑!