基本上我尝试匹配从这个图像得到的所有描述符:
我使用基于flann匹配器的LSH算法和BRISK进行特征检测和描述,从图像数据库中获取所有描述符.
我的图像数据库由242个图像组成.在该242个图像中,存在与在上述“复杂”图像查询中分别拍摄的每个对象相对应的三个图像.
以下是用于BRISK检测的参数(默认opencv参数):
阈值:30,八度值:4,模式比例:1.0.
在使用最佳匹配技术进行flann匹配之后(图像查询中的每个描述符与数据库描述符集中最近的邻域相关联),我的算法输出按匹配百分比排序的数据库图像列表.以下是四个第一个结果:
>与数据库中的螺栓对应的图像:4个匹配/ 15个检测到的关键点=>匹配百分比:26.7%.
>对应于数据库中的瓶子的图像具有4个匹配/ 15个检测到的关键点=>匹配百分比:26.7%.
>对应于数据库中的螺栓的图像具有10个匹配/ 59个检测到的关键点=>匹配百分比:16.9%.
>对应于图像查询中不存在的对象的图像:1匹配/ 16个检测到的关键点=>匹配百分比:16.7%.
我使用ORB作为特征检测和描述来比较这些结果.以下是使用的参数:特征数量:2000,比例因子:1.2,金字塔等级数量:8.
以下是我得到的结果:
>与数据库中的螺栓对应的图像:576匹配/ 752检测到的关键点=>匹配率:76.6%.
>对应于数据库中的瓶子的图像具有111个匹配/ 189个检测到的关键点=>匹配率:58.7%.
>与数据库中的笔相对应的图像具有124个匹配/ 293个检测到的关键点=>匹配百分比:42.3%.
>对应于图像查询中不存在的对象的图像:2个匹配/ 66个检测到的关键点=>匹配百分比:3%.
正如您所看到的,ORB的结果要好得多.首先,在数据库中的每个图像上检测到更多的关键点,并且匹配的百分比对于好的对象明显更好.此外,良好对象的匹配百分比与错误对象的匹配百分比之间的差距更为显着.
我想知道为什么BRISK探测器检测到的关键点比ORB探测器少得多.我已经做了不同的测试来弄清楚如何用BRISK探测器探测更多的关键点(降低阈值,减少八度数).我确实可以检测到更多的关键点,但与ORB检测器的差异仍然非常重要.你知道为什么BRISK探测器有这样的行为吗?
我的OpenCV版本是2.4.8,但我根据这些声明尝试了2.4.4和2.4.9版本的BRISK检测部分:
http://code.opencv.org/issues/2491和BRISK feature detector detects zero keypoints没有改进.
我还尝试将ORB检测器与BRISK描述相结合.匹配结果优于第一种方法(完全BRISK),但比第二种方法(完整ORB)更差:
>与数据库中的螺栓对应的图像:529匹配/ 708检测到的关键点=>匹配百分比:74.7%.
>对应于数据库中的瓶子的图像具有69个匹配/ 134个检测到的关键点=>匹配百分比:51.5%.
>对应于数据库中笔的图像具有匹配93/247检测到的关键点=>匹配百分比:37.6%.
>对应于图像查询中不存在的对象的图像:5个匹配/ 50个检测到的关键点=>匹配百分比:10%.
请注意,在方法2和方法3中,每个图像上检测到的关键点数量并不相同.实际上,当我在测试图像上运行此代码时(此处为螺栓图像):
// BRISK parameters int Threshl=30; int Octaves=4; float PatternScales=1.0f; // ORB parameters int nFeatures=2000; float scaleFactor=1.2f; int nLevels=8; BRISK BRISKD(Threshl, Octaves, PatternScales); ORB ORBD(nFeatures, scaleFactor, nLevels); vector<KeyPoint> kpts; Mat descriptors; Mat img = cv::imread("Path to the bolt image", IMREAD_GRAYSCALE ); ORBD.detect(img,kpts); // Number of keypoints detected = 752 BRISKD.compute(img, kpts, descriptors); // Number of descriptors = 708
BRISK似乎不计算描述符中的所有检测到的关键点(由ORB检测器检测到的752个关键点=>由BRISK描述符计算的708个描述符).
但是,即使ORB检测到的所有关键点都未在BRISK描述符中计算.在这些结果中似乎BRISK描述关键点并不比ORB更好?纠正我,如果我错了,但我很确定它应该是相反的……
如果你们有任何元素可以帮助我理解我的结果,或者你已经在OpenCV中遇到过BRISK的一些问题,请告诉我.任何帮助将不胜感激 :).
好的,我想出了如何从BRISK获得我期望的结果.我在这里尝试了BRISK创建者的代码:
https://github.com/calihem/mavhub/tree/master/thirdparty
以下是我得到的结果:
>与数据库中的螺栓对应的图像:149匹配/ 288个检测到的关键点=>匹配百分比:51.7%.
>对应于数据库中的瓶子的图像具有27个匹配/ 57个检测到的关键点=>匹配百分比:47.4%.
>与数据库中的笔相对应的图像具有38个匹配/ 101个检测到的关键点=>匹配百分比:37.6%.
>对应于图像查询中不存在的对象的图像:5个匹配/ 76个检测到的关键点=>匹配百分比:6.6%.
这些结果比我以前的要好得多.实际上,它们并不比使用ORB获得的特定查询图像更好.然而,我尝试了其他查询图像,特别是更复杂的图像和BRISK优于ORB.
至少从2.4.4版本到当前版本2.4.9,opencv中的BRISK实现似乎存在问题.我认为这个bug应该很快修复,因为它已经报告给opencv社区(http://code.opencv.org/issues/2491).
与此同时,我建议您使用BRISK创建者编写的代码,该代码运行良好;).