你用
knnMatch配上 Lowe’s ratio test 过滤误匹配,写了三行代码就搞定了特征匹配。但你想过这三行背后的 1400 行matchers.cpp里到底在做什么吗?BFMatcher 的暴力遍历为什么要区分 L2 和 Hamming 两条路径?FLANN 在train()的时候到底建了一棵什么树?KD-Tree 的 Best-Bin-First 搜索怎么在放弃精确解的同时保住了可用精度?二进制描述子走 LSH 索引时,那张哈希表里存的到底是什么?这篇文章,从
matchers.cpp、miniflann.cpp、kdtree_index.h、lsh_index.h、dist.h五个核心源文件出发,完整拆解 OpenCV 描述子匹配的两条主路径。最后,我们会把这些知识串起来,动手搭一个图像检索系统——建特征数据库、查询 Top-5 相似图、计算检索精度。
全局地图:描述子匹配的两条路
在 OpenCV 的设计里,所有描述子匹配器都继承自同一个基类DescriptorMatcher。这个类定义在features2d.hpp的第 1003 行:
// opencv/modules/feat