C++ OpenCV如何实现KLT稀疏光流跟踪


这篇文章主要介绍了C++ OpenCV如何实现KLT稀疏光流跟踪,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。实现原理首先要在初始帧中检测特征点,之后在下一帧中尝试跟踪这些点。你必须找到新的图像帧中这些点的位置,因此,你必须在特征点的先前位置附近进行搜索,以找到下一帧中它的新位置。输入两个连续的图像帧以及第一幅图像中检测到的特征点数组,该函数将返回一组新的特征点为位置。为了跟踪完整的序列,你需要在帧与帧之间重复这个过程,不可避免地你也会丢失其中一些点,于是被跟踪的特征点数目会减少。为了解决这个问题,我们可以不时地检测新的特征值。
函数APIcalcOpticalFlowPyrLK( InputArray prevImg, InputArray nextImg,
InputArray prevPts, InputOutputArray nextPts,
OutputArray status, OutputArray err,
Size winSize = Size(21,21), int maxLevel = 3,
TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01),
int flags = 0, double minEigThreshold = 1e-4 );参数说明:prevImg: 第一帧(跟踪图像的前一帧,一般是定位特征点)
nextImg: 第二帧/当前帧
prev_Pts: 第一帧特征点集
next_Pts: 计算输出的第二帧光流特征点集
status : 状态标志位,如果对应特征的光流被发现,数组中的每一个元素都被设置为 1, 否则设置为 0。
err:双精度数组,包含原始图像碎片与移动点之间的误差。代码演示我们还是用接着上一章的DEMO,继续往下做定义基本数据上面的API也提到我们会检测当前帧和前一帖进行处理,所以我们要先定义关于前一帧及当前帧的一些相关数据,下图红框内就是我们定义的用于处理的基本数据。然后在检测到特征点后判断前一帧灰度图是否存在,如果不存在先复制过来检测新的特征点上面红线标的就是我闪可能在检测过程中出现的问题,所以我们这里也要改造一下检测,用我们定义的ftps的参数里面设置一个数值,用于检测如果数值小于我们设置的数后就重新检测特征点。我们改造一下寻找特征点这块。先放一下原先的检测代码,红框部分是我们要改造地部分
下面这张是我们改造后的源代码上面可以看出,我们把检测出的特征点数组存放到了fpts[0]中,当前一帧的特征点小于30后我们将重新检测,然后把检测出的结果存放到前一帧fpts[0]和初始化的特征点IniPoints里,最后再打印一个字符,可以从命令行里看到当前状态是在检测特征点,当特征点大于30时我们就打印一个检测的字符。 香港云主机实现稀疏光流跟踪首先我们先在最上方定义一个HLK跟踪的方法及跟踪成功的状态和误差参数然后我们在写这个方法,这里就用到了我们的calcOpticalFlowPyrLK函数API然后在上面的跟踪那里加入这个方法绘制源图最后在源图上画出特征点并把当前帧数据放到前一帧里,由于我们把前一帧数据已经转移到了fpts[0]里,所以这里也改为过来,然后我们又加入了画出直线的一个操作,用于观察移动的原点与现在的一个距离。
下面是视频中的截图
感谢你能够认真阅读完这篇文章,希望小编分享的“C++ OpenCV如何实现KLT稀疏光流跟踪”这篇文章对大家有帮助,同时也希望大家多多支持开发云,关注开发云行业资讯频道,更多相关知识等着你来学习!

相关推荐: 如何解决laravel项目本地环境PHP7报错each函数废弃问题

如何解决 香港云主机laravel项目本地环境PHP7报错each函数废弃问题,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。例子1:php7.1写法改为php7.2写法例子2例子3…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 08/29 21:55
Next 08/29 21:55

相关推荐