2014-12-04 79 views
0

我试图用openCV实现SIFT,并且我参考了这些链接link1link2。此外,我还阅读了Lowe写的关于SIFT的论文。我对链接1和链接2中的代码有一些问题。使用openCV在图像中实现SIFT

  1. cv :: SiftFeatureDetector detector(0.05,5.0); cv :: SiftDescriptorExtractor提取器(3.0);

    我无法完全理解上述函数中的参数。如果我将第一个函数修改为cv :: SiftFeatureDetector检测器(0.05,10.0); ,有一个运行时间OpenCV错误:断言失败< firstOctave> = - 1 %% actualNLayers < = nOctaveLayers>。

    此外,我没有意识到SiftDescriptorExtractor提取器()中的参数。我知道在关键点匹配中存在距离比率,但范围是[0,1]。

  2. 我想修改我用来匹配图片的方法,所以我需要提取描述符和每个关键点的主导方向。如何提取每个关键点的描述符和主导方向?

非常感谢您的回复。

回答

3

我的建议是,你应该在开始时使用SIFT的默认参数。然后,如果您对结果不满意,可尝试优化这些参数。

Ptr<FeatureDetector> detector = new SIFT();; 
Ptr<DescriptorExtractor> extractor = new SIFT(); 

U可以找到有关OpenCV的执行这里SIFT参数有用的信息:http://docs.opencv.org/modules/nonfree/doc/feature_detection.html

要计算关键点:

vector<KeyPoint> keypoints; 
detector->detect(yourImage, keypoints); 

当你计算关键点的方位自动计算并与每个关键点的参数“角度”相关联。请在这里找到更多的信息:http://docs.opencv.org/modules/features2d/doc/common_interfaces_of_feature_detectors.html

要计算关键点的描述:

Mat descriptors; 
extractor->compute(yourImage, keypoints, descriptors); 

作为垫描述一个描述符的每一行。

如果您有任何问题,请让我知道! 希望这有助于。

+0

我寻觅其他物品和实施SIFT通过OpenCV的。我使用cv :: SIFT siftDetectorExtractor = cv :: SIFT(0,3,0.04,10,1.6);和siftDetectorExtractor(tmp,cv :: Mat(),keypoints1,sifts1);.但是,当我想知道关键点的协调时,我使用keypoints1 [0] .pt并且结果不是整数。为什么?图像是数字的,所以关键点的协调需要是整数。 – Kuo 2014-12-05 15:21:32

+0

此外,我已经通过sifts1.at (0,0)访问sifts1.at (0,127)描述符的第一个关键点。我是否需要将sifts1.at (0,0)的顺序在匹配前旋转到sifts1.at (0,127)和其他关键点的描述符?或者它的顺序是从主导方向开始,并自动结束在主导方向?所以我可以直接使用结果进行匹配。 – Kuo 2014-12-05 15:25:19

+0

此外,我仍然无法找到cv :: SiftDescriptorExtractor提取器()中参数的含义;你在我的学习中帮助我很多。非常感谢您的回复。 – Kuo 2014-12-05 15:27:41

1
  • cv :: SiftFeatureDetector检测器(0.05,5.0),第一个参数是对比度阈值。这是接受关键点的最小对比度。第二个参数是边缘拒绝阈值。如果你想获得更多的功能,你应该增加第一个参数和/或减少第二个参数。
  • cv :: SiftDescriptorExtractor提取器(3.0),参数是magnificaiton值,描述符的大小是通过关键点乘以该值来确定的。使用前缀参数是可以的。

欲了解更多信息:http://docs.opencv.org/2.3/modules/features2d/doc/common_interfaces_of_descriptor_extractors.html