对于我的硕士论文,我正在对 SIFT SURF en 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 关键点的 de 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));