我尝试使用openCV实现SIFT,并且我已经引用了这些链接link1和link2。此外,我还阅读了Lowe撰写的关于SIFT的论文。我对link1和link2中的代码有一些问题。
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]。
我想修改我用来匹配图片的方法,所以我需要提取描述符和每个关键点的主导方向。如何提取每个关键点的描述符和主导方向?
非常感谢您的回复。
答案 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)
了解更多信息:http://docs.opencv.org/2.3/modules/features2d/doc/common_interfaces_of_descriptor_extractors.html