我正在尝试使用OpenCV(用于C ++)的BRISK实现来检查照片中是否包含图像(或图像的一部分)。例如,我拍了照片,然后我尝试将它与数据库中的一组图像相匹配,我想选择最佳的相应图像(如果所有图像都不够好,则选择错误信息)。
所以,我现在只是测试OpenCV。我只是采用了框架中包含的样本(matching_to_many_images),并将检测器和描述符从SURF更改为BRISK。
然而,我有奇怪的结果。这些是匹配(BruteForce Hamming)的结果:
在第一个场景中,场景完全不同,但有很多比赛! 在第二个场景中,场景非常相似,但有些匹配是错误的。
我认为这是一个参数问题 - 因为在BRISK的演示视频中,结果非常重要。
答案 0 :(得分:3)
使用SIFT,SURF,BRISK或任何其他本地描述符进行特征匹配时,通常会有许多不正确的初始匹配。
由于背景杂乱引起的模糊特征或功能,许多初始匹配将不正确。 [来自Distinctive Image Features from Scale Invariant Keypoints]
下一步是仅选择那些在两个图像之间的共同转换上达成一致的匹配的子集。这在Distinctive Image Features from Scale Invariant Keypoints的第7.3和7.4节中进行了解释。
答案 1 :(得分:2)
您是否看过BRISK的OpenCV文档?我不确定你现在使用的是什么参数,但是你可以指定阈值和八度音程以及模式。文件在 http://docs.opencv.org/modules/features2d/doc/feature_detection_and_description.html#brisk
你也可以尝试不同的特征匹配算法,虽然看起来在BRISK论文中它们也使用了汉明距离
最后,错误的功能匹配并不太令人意外;尝试不同的场景以及不同的功能参数,看看你的结果如何
答案 2 :(得分:2)
OpenCV Tutorial提供了一个很好的例子,说明如何提取特征和计算单应性(一种转换,告诉你如何将每个点从一个图像转换为另一个图像)。
您可以将特征检测器/描述符替换为任何其他特征检测器/描述符,这将导致对某些转换(如旋转,缩放或模糊或照明更改等错误)的不同鲁棒性。 BRISK的基本实现已经定义了meaningful parameters。
最后但并非最不重要的是,如果您尝试匹配两个完全不同的图像,您会期望得到什么结果?该算法将尝试找到相似性,因此总是计算结果,即使它是无意义的并且得分非常低。请记住: Garbage in - >垃圾出来。