我正在开发一个程序来检测两张图片之间的相似性,以确定它们是否代表同一个对象。在研究了该主题后,我确定需要 3 个主要组件:
- 探测器
- 提取器/描述符
- 匹配器
我已经成功地实现了前两个(如果您需要帮助,请 PM 我,我知道这可能会很痛苦),但是我遇到了匹配器的问题。这是我使用的代码的一部分:
DMatch matches = new DMatch();
BFMatcher matcher = new BFMatcher(NORM_HAMMING, true);
[...]
matcher.match(descriptor1, descriptor2, matches, null);
System.out.println("Matches: " + matches.capacity());
match.capacity() 的输出是 58,当我希望它是完全相同数量的关键点或描述符点时(因为我正在将图像与自身进行比较......)。我期待错误的结果吗?我做错了什么吗?一些帮助将不胜感激:)
编辑:
我已经设法完成了我的程序,现在可以回答我自己的问题,希望它能对我以前的情况有所帮助:
matcher.match(...) 方法计算描述每个图像的二进制字符串或浮点向量(例如描述符 1 和描述符 2),返回查询索引(keypoints1 中关键点的索引)、训练索引(keypoints2 等效的索引匹配 queryIndex 中的点)和这些点之间的汉明距离。这将图像 1 中的每个点与图像 2 中的每个点匹配(至少来自 drawMatches,这是我的结论),但是如果要确定两个图像之间的匹配率,则需要过滤 DMatch 匹配内容。为此,您必须自己创建一个算法(我在网上找到的算法都不能很好地工作,例如 2*minDist)。
如果您需要更多帮助或一些代码,请随时 PM 我。我知道理解整个图像匹配过程是多么令人沮丧!