使用openCV在图像中实现SIFT

时间:2014-12-04 15:26:10

标签: image opencv image-processing sift

我尝试使用openCV实现SIFT,并且我已经引用了这些链接link1link2。此外,我还阅读了Lowe撰写的关于SIFT的论文。我对link1和link2中的代码有一些问题。

  1. cv :: SiftFeatureDetector探测器(0.05,5.0); cv :: SiftDescriptorExtractor extractor(3.0);

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

    另外,我没有在SiftDescriptorExtractor提取器()中实现该参数。我知道关键点匹配中存在距离比,但范围是[0,1]。

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

  3. 非常感谢您的回复。

2 个答案:

答案 0 :(得分:3)

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

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

您可以在此处找到有关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);

将Mat描述符的每一行作为一个描述符。

如果您有任何疑问,请与我们联系! 希望这会有所帮助。

答案 1 :(得分:1)

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

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