温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-11-26 10:42:30 来源:亿速云 阅读:270 作者:小新 栏目:大数据

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

实现原理

首先要在初始帧中检测特征点,之后在下一帧中尝试跟踪这些点。你必须找到新的图像帧中这些点的位置,因此,你必须在特征点的先前位置附近进行搜索,以找到下一帧中它的新位置。输入两个连续的图像帧以及第一幅图像中检测到的特征点数组,该函数将返回一组新的特征点为位置。为了跟踪完整的序列,你需要在帧与帧之间重复这个过程,不可避免地你也会丢失其中一些点,于是被跟踪的特征点数目会减少。为了解决这个问题,我们可以不时地检测新的特征值。

函数API

 calcOpticalFlowPyrLK( 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也提到我们会检测当前帧和前一帖进行处理,所以我们要先定义关于前一帧及当前帧的一些相关数据,下图红框内就是我们定义的用于处理的基本数据。

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

然后在检测到特征点后判断前一帧灰度图是否存在,如果不存在先复制过来

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

检测新的特征点

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

上面红线标的就是我闪可能在检测过程中出现的问题,所以我们这里也要改造一下检测,用我们定义的ftps的参数里面设置一个数值,用于检测如果数值小于我们设置的数后就重新检测特征点。我们改造一下寻找特征点这块。

先放一下原先的检测代码,红框部分是我们要改造地部分

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

下面这张是我们改造后的源代码

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

上面可以看出,我们把检测出的特征点数组存放到了fpts[0]中,当前一帧的特征点小于30后我们将重新检测,然后把检测出的结果存放到前一帧fpts[0]和初始化的特征点IniPoints里,最后再打印一个字符,可以从命令行里看到当前状态是在检测特征点,当特征点大于30时我们就打印一个检测的字符。

实现稀疏光流跟踪

首先我们先在最上方定义一个HLK跟踪的方法及跟踪成功的状态和误差参数

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

然后我们在写这个方法,这里就用到了我们的calcOpticalFlowPyrLK函数API

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

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

然后在上面的跟踪那里加入这个方法

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

绘制源图

最后在源图上画出特征点并把当前帧数据放到前一帧里,由于我们把前一帧数据已经转移到了fpts[0]里,所以这里也改为过来,然后我们又加入了画出直线的一个操作,用于观察移动的原点与现在的一个距离。

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

下面是视频中的截图

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

感谢你能够认真阅读完这篇文章,希望小编分享的“C++ OpenCV如何实现KLT稀疏光流跟踪”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI