工作需要,想实现一个可以完成图片匹配的模块,正好之前在研究VINS,反正也比较相关,所以开始跳坑.
1. 基本设想
这个问题实际上可以看做是VO里的回环检测的部分,与回环检测不大一致的地方可能是关键帧的库比较大,同时物体的姿态是未知的.自然的可以沿袭回环检测的思路,使用BOW创建图片库的词典,然后后面匹配时使用字典匹配.描述子和关键点的选择上就先考虑比较快速的ORB,而在匹配时直接使用同样的描述子,完成匹配.
目前使用的图片库大小也仅不到一千张,生成的词典也不是很大.
// 一次试验的词典大小
Vocabulary: k = 10, L = 5, Weighting = tf-idf, Scoring = L1-norm, Number of words = 62752
2. 匹配
匹配过程也比较简单,加载词典,而后生成匹配数据库,计算ORB 描述子,装入词典
DBoW3::Vocabulary vocab("./vocabulary22.yml.gz");//指定自己的图片字典
//装入图片库的描述子
for ( int i=0; i<trainDescriptors.size(); i++ )
db.add(trainDescriptors[i]);
逐行完成匹配
DBoW3::QueryResults ret;
db.query( descriptors[i], ret, 3);
将匹配成功的图片对应缩放在同一张图中对比.
整体来说,由于我的研究任务里,扭曲不是要解决的重点,一般的问题只是旋转和物品的改变,所以整体匹配效果较好,大约有70%出现的位置都能与库里的正确匹配.
3. 误匹配
但是仍然出现了许多的误匹配图,误匹配出现的情况主要有以下几类:
- 环境相似
- 白墙
- 图片中的物体相似
- 待匹配图片不在库中
- 关照明暗变化
- 成像质量,模糊等问题
- 不同终端拍摄的照片差异
- 尺寸
- 颜色
- 尺度问题