使用vs2019、opencv2314 vs配置opencv2314:属性中的VC++包含目录和库目录设置,链接器中的输入中的附加依赖项设置路径
见链接
首先我测试了ORB
进行识别匹配、跟踪,ORB
速度较快,但是在某些场景下匹配跟踪效果不好,于是使用surf
和sift
进行实验。使用surf
后,匹配方式使用Flan
方式匹配,出现匹配乱的情况,使用RANSAC
修正后效果较好,另外采用KNN
匹配,调节几个相关参数后,获得较好的平面跟踪效果,但是输出视频后速度达不到25s每帧,于是使用光流追踪;单独使用光流追踪,匹配追踪效果比较稳定,但是当特征消失后不能重新追踪,于是考虑sift和光流结合,两者结合后得到较好的匹配结果。另外试验了单独使用sift
的消融实验,发现出现明显卡顿;设计了交互式选取物体的代码,程序可以实时测试。
背景增多后识别效果不太好,重要影响因素:Orb
没有尺度不变性,远离或者靠近相机后识别误差大大增加。
Videocapture
后的使用:先抓取画面,然后解码;
read()
综合抓取和解码过程,grab()
为抓取,retrieve
为解码,其中这种方法可以按帧抓取(后续尝试连续抓取处理视频);
Cap>>frame
为read
方法。
BFMatcher暴力匹配,计算量大。 FlannBasedMatch中FLANN是Fast Library forApproximate Nearest Neighbors,它是一种近似法,算法更快但是找到的是最近邻近似匹配,当我们需要找到一个相对好的匹配但是不需要最佳匹配的时候可以用FlannBasedMatcher
其中FlanBasedMatcher里面还有不同的match方法,具体matching的方法
1.match: 给定查询集合中的每个特征描述子,寻找最佳匹配,返回值按距离升序排列。
2.knnMatch:给定查询集合中的每个特征描述子,寻找k个最佳匹配
3.radiusMatch:在特定范围内寻找特征描述子,返回特定距离内的匹配
距离输出后可以看出是0—1之间的整数,使用match方法时,利用最小距离和最大距离做筛选,总是会有留下的点,当特征点消失时也会匹配,也就是宁愿匹配错误,也要匹配。
使用RANSAC,利用单应性矩阵对得到的点做筛选,可以看到当特征消失时不会再出现乱匹配的情况。
因为KNN对于得到的match的第一个距离和第二个距离通过比值做筛选,当特征点消失时两者都不会产生错乱匹配;
对比与区别:
RANSAC通过计算单应性矩阵得到匹配点,对于使用光流追踪的方法也会减少点的数量,不适合用光流法。
而KNN在光流存在情况下表现出较好的匹配性,因此选择KNN匹配筛选。
- 能否达到25帧/s的处理呢?
这里通过前面提到的控制输出帧率与查看视频是否加快来进行测试。
按照25帧率输出,视频加快了,说明surf不能达到实时处理精度。
- 使用surf匹配线有明显的闪动,能否更加平稳?
使用光流增强速度和稳定性。
给出前一个时间步的图像,关键点,可以得到下一个时间追踪的关键点;status表示是否移动;
测试使用status删除不动的噪音点,如果图像本身不动也会删除一些点,因此直接使用,不使用status判断。
1.单独使用光流法,会出现一旦匹配不上,之后都匹配不上的问题。一步错,步步错。
2.匹配特征点为****0,后序光流函数报错;
1.每隔几帧刷新使用surf检测。
2.检测每次的追踪特征点数目,当小于阈值时,强制采用surf检测。
-
传统方法ORB,Sift,Surf在视频中应用存在问题
-
FlannBasedMatcher的三种方法效果实验
-
RANSAC的效果与KNN对比
-
光流追踪
-
对于实验操作性上,交互式选取等处理,实时测试