使用FAST检测算法加速SURF描述符的提取?

7
为了我的硕士论文,我正在智能手机上运行一些关于SIFT SURF和FAST算法的测试,以用于标志识别。当我对某些方法进行检测、描述和匹配的简单时间统计时,得到以下结果。对于SURF检测器和SURF描述符:
- 180个关键点被发现 - 1,994秒的关键点计算时间(SURF) - 4,516秒的描述时间(SURF) - 0.282秒的匹配时间(SURF)
当我使用FAST检测器而不是SURF检测器时:
- 发现319个关键点 - 0.023秒的关键点计算时间(FAST) - 1.295秒的描述时间(SURF) - 0.397秒的匹配时间(SURF)
FAST检测器比SURF检测器快得多,甚至以100倍的速度检测出了近两倍的关键点。这些结果是可以预见的。
然而,下一步结果并非预期。在319个FAST关键点上,SURF描述符比180个SURF关键点更快。据我所知,描述与检测算法无关......然而这些结果并不如预期。
有人知道这是如何可能的吗?这里是代码:
    FeatureDetector detector = FeatureDetector.create(FeatureDetector.SURF);
    //FeatureDetector detector = FeatureDetector.create(FeatureDetector.FAST);
    Imgproc.cvtColor(image1, image1, Imgproc.COLOR_RGBA2RGB);
    Imgproc.cvtColor(image2, image2, Imgproc.COLOR_RGBA2RGB);

    DescriptorExtractor SurfExtractor = DescriptorExtractor
    .create(DescriptorExtractor.SURF);


    //extract keypoints
    long time= System.currentTimeMillis();
    detector.detect(image1, keypoints);
    Log.d("LOG!", "number of query Keypoints= " + keypoints.size());
    detector.detect(image2, logoKeypoints);
    Log.d("LOG!", "number of logo Keypoints= " + logoKeypoints.size());
    Log.d("LOG!", "keypoint calculation time elapsed" + (System.currentTimeMillis() -time));

    //Descript keypoints
    long time2 = System.currentTimeMillis();
    Mat descriptors = new Mat();
    Mat logoDescriptors = new Mat();
    Log.d("LOG!", "logo type" + image2.type() + "  intype" + image1.type());
    SurfExtractor.compute(image1, keypoints, descriptors);
    SurfExtractor.compute(image2, logoKeypoints, logoDescriptors);
    Log.d("LOG!", "Description time elapsed" + (System.currentTimeMillis()- time2));

你能否请发布一些你的代码? :) - Codeman
我的一些代码已经添加到了问题中! - piepie
1个回答

7
据我所知,SURF描述符提取最耗时的部分是对每个关键点周围大小为(2.8 * keypoint.size x 2.8 * keypoint.size)的补丁进行亚像素提取。因此,我的猜测是:FAST检测器发现的关键点其“size”始终等于7,但SURF检测器可以找到更大尺寸的关键点。因此,处理180个“大”关键点比处理319个“小”关键点需要更长时间。

1
我已经研究出了SIFT描述符,但在我的论文中没有完全描述SURF描述符,也许如果我这样做了,我就会知道这个问题的答案。你的解释似乎非常合理,我认为这可能是我问题的正确答案!谢谢! - piepie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接