opencv3/c++如何实现光流点追踪

  介绍

这篇文章主要介绍了opencv3/c++如何实现光流点追踪,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。

<强>光流金字塔

calcOpticalFlowPyrLK()函数参数说明:

void  calcOpticalFlowPyrLK (   InputArray  prevImg,,//第一个8位输入图像或者通过,buildOpticalFlowPyramid()建立的金字塔   InputArray  nextImg//第二个输入图像或者和prevImg相同尺寸和类型的金字塔   InputArray  prevPts,,//二维点向量存储找到的光流;点坐标必须是单精度浮点数   InputOutputArray  nextPts//输出二维点向量(用单精度浮点坐标)包括第二幅图像中计算的输入特征的新点位置;当OPTFLOW_USE_INITIAL_FLOW 标志通过,向量必须有和输入一样的尺寸。   OutputArray 地位,,//输出状态向量(无符号字符);如果相应的流特征被发现,向量的每个元素被设置为1,否,则被置为0。   OutputArray 犯错,//输出错误向量;向量的每个元素被设为相应特征的一个错误,误差测量的类型可以在旗参数中设置,如果流不被发现然后错误未被定义(使用状态(状态)参数找到此情形)。   Size  winSize =,大小(21日21),,//在每个金字塔水平搜寻窗口的尺寸。   int  maxLevel =, 3,//最大金字塔层数;,如果设置为0,则不使用金字塔(单层),如果设置为1,则使用两个层次,依此类推;,如果将金字塔传递给输入,则算法将使用与金字塔一样多的级别,但不超过maxLevel。   TermCriteria  criteria =, TermCriteria (TermCriteria::计数+ TermCriteria:: EPS,, 30日,0.01),//指定迭代搜索算法的终止标准(指定的最大迭代次数criteria.maxCount或搜索窗口移动小于criteria.epsilon)   int  flags =, 0,,//操作标志   double  minEigThreshold =, 1 e-4 //计算光流方程的2×2标准矩阵的最小特征值除以窗口中的像素数量,如果这个值小于minEigThreshold,那么一个相应的特征被过滤出来,且它的光流不被处理,所以它允许去除坏点提升性能。   ); # include   using  namespace 简历;//光流跟踪   Mat 框架,灰色的,,,,pr_frame pr_gray;   std:: vector,功能;   ,,,,,//角点检测   ,,,,,goodFeaturesToTrack(灰色、时间特性,大敌;;300年,0.01,10);   ,,,,,把[0].insert(把[0]指标(),最终,features.begin (),, features.end ());   ,,,,,inPoints.insert (inPoints.end (),, features.begin (),, features.end ());   ,,,}   ,,,   ,,,,,printf (“object 跟踪……\ n"),,   ,,,if  (pr_gray.empty ()),   ,,,,,gray.copyTo (pr_gray);   ,,,trackFeature ();   ,,,for  (int 小姐:=,0;,小姐:& lt;,把[0].size();,我+ +),   ,,,,,圆(框架,,把[0][我],,2,,标量(0255 0),2,8,0);   ,,,gray.copyTo (pr_gray);   ,,,frame.copyTo (pr_frame);   ,,,imshow (“output",,框架);   ,,,waitKey (1);   ,,}   waitKey才能(0);   capture.release才能();   return 才能;0;   }         void  trackFeature ()   {   std::才能vector,地位;   std::才能vector,错误;//计才能算稀疏特征集的光流   calcOpticalFlowPyrLK才能(pr_gray,灰色,,把[0],,把[1],,,,错误);   int 才能;k =, 0;   for 才能;(int 小姐:=,0;,小姐:& lt;,把[1].size();,我+ +)   {才能   ,,,double  dist =, abs(把[0][我].x-fpts[1][我]。x), +, abs(把[0][我].y-fpts[1][我].y);   ,,,if  (2, dist 的在,,,,,地位[我])   ,,,{   ,,,,,inPoints [k],=, inPoints[我];   ,,,,,把[1][k + +],=,把[1][我];   ,,,}   ,,}   inPoints.resize才能(k);   把才能[1].resize (k);//才能绘制光流轨迹   RNG 才能提高(0),,   for 才能;(int 小姐:=,0;,小姐:& lt;,把[0].size();,我+ +)   {才能   ,,,Scalar  color =,标量(rng.uniform (0255), rng.uniform (0255), rng.uniform (0255);   (,,,行,,inPoints[我],把[1][我],,颜色,2);   ,,,圆(框架,,把[1][我],,2,,标量(0255255),2);   ,,}   ,,std:: swap(把[1],,把[0]);   null

opencv3/c++如何实现光流点追踪