我想将图片与目前包含超过2500张图片的数据库相匹配,但我需要找到一种方法,以获得至少10万张图片的良好效果。
我已经阅读了很多关于stackoverflow的帖子,但我找不到合适的解决方案来解决我的问题。 我想过使用直方图,但如果我理解得很好,找到相似之处很有用,但我需要一个“完美”匹配。
我目前有一些代码可以完成任务,但速度太慢(大约需要6秒才能找到2500张图片的匹配)
我正在使用ORB检测器cv2.ORB()
来查找关键点和描述符,FlannBasedMatcher和使用RANSAC的findHomography函数,如下所示。
FLANN_INDEX_LSH = 6
flann_params = dict(algorithm = FLANN_INDEX_LSH, table_number = 6, key_size = 12, multi_probe_level = 1)
...
self.matcher = cv2.FlannBasedMatcher(params, {})
...
(_, status) = cv2.findHomography(ptsA, ptsB, cv2.RANSAC, 4.0)
我想知道是否有更好,更重要,更快捷的方式来匹配我的数据库,也许是一种不同的方式将图片存储在数据库中(我目前正在保存关键点和描述符)。
我希望我很清楚,如果你需要更多细节,请在评论中发帖。
答案 0 :(得分:2)
我正在做的是识别视频捕获书中的页面,这就是为什么我需要我的代码快速,准确。
我找到了一种更快的方法来完成这项工作,我在启动时使用整个数据库构建了一个FLANN索引(使用3k图片并不慢),我得到了link的帮助。
此外,这是最重要的部分,我将flann_params
更改为:
flann_params = dict(algorithm = FLANN_INDEX_LSH, table_number = 10, key_size = 20, multi_probe_level = 0)
为了不失去这些参数的准确性,我将ORB探测器提取的特征点数量从400改为700.
它解决了我的问题,比赛在2到3秒之间完成(6秒没有FLANN索引),现在大概是25 / 30ms
但即使在这个解决方案之后,我仍然愿意接受新的建议,以提高准确性而不会失去太多速度。