介绍
这篇文章主要介绍了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,那么一个相应的特征被过滤出来,且它的光流不被处理,所以它允许去除坏点提升性能。 );
# includeusing 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++如何实现光流点追踪