基本上你首先要做的是:
SurfFeatureDetector surf(400);
surf.detect(image1, keypoints1);
然后是:
surfDesc.compute(image1, keypoints1, descriptors1);
为什么检测和计算是2种不同的操作?
检测后进行计算不会产生冗余循环?
我发现自己.compute
是我申请中最贵的。
.detect
在 0.2secs
中完成.compute
需要〜1秒。有没有办法加快.compute
?
答案 0 :(得分:9)
关键点的检测只是选择图像中被认为是“好特征”的点的过程。
这些关键点的描述符的提取是一个完全不同的过程,它编码该特征的属性,如与邻居等的对比,因此可以与来自不同图像,不同sclae和方向的其他关键点进行比较。
您描述关键点的方式对于成功匹配至关重要,这确实是关键因素。您描述关键点的方式也是匹配速度的决定因素。例如,您可以将其描述为浮点数或二进制序列。
答案 1 :(得分:3)
检测图像中的关键点和计算这些关键点的描述符之间存在差异。例如,您可以提取SURF关键点并计算SIFT功能。请注意,在DescriptorExtractor :: compute方法中,将应用关键点上的过滤器:
KeyPointsFilter::runByImageBorder()
KeyPointsFilter::runByKeypointSize();
答案 2 :(得分:0)
从Jay_Rock离开的地方开始,您可以使用ORB,Brisk或FREAK等算法提供的二进制描述符来改善处理时间。它们不仅会占用32位而不是64位,它们还提供了不同的计算描述符的方法,这些方法与SURF一样强大且速度更快。
如果您最终想要在描述符之间执行匹配操作,可以通过计算两者之间的汉明距离来完成。鉴于它是两个二进制字符串之间的XOR操作,运行只需几毫秒。