使用openCV在图像中实现SIFT
Posted
技术标签:
【中文标题】使用openCV在图像中实现SIFT【英文标题】:Using openCV to implement SIFT in image 【发布时间】:2014-12-04 15:26:10 【问题描述】:我尝试使用 openCV 实现 SIFT,我参考了这些链接 link1 和 link2。此外,我还阅读了 Lowe 撰写的关于 SIFT 的论文。我对link1和link2中的代码有一些问题。
cv::SiftFeatureDetector 检测器(0.05, 5.0); cv::SiftDescriptorExtractor 提取器(3.0);
我无法完全理解上述函数中的参数。如果我将第一个函数修改为 cv::SiftFeatureDetectordetector(0.05, 10.0); ,运行时出现OpenCV Error:Assertion failed
另外,我没有实现SiftDescriptorExtractor extractor()中的参数。我知道关键点匹配中存在距离比,但范围是 [0,1]。
我想修改我用来匹配图片的方法,所以我需要提取描述符和每个关键点的主要方向。如何提取提取每个关键点的描述符和主导方向?
非常感谢您的回复。
【问题讨论】:
【参考方案1】:我的建议是,你应该在一开始就使用 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 描述符的每一行一个描述符。
如果您有任何问题,请告诉我! 希望这会有所帮助。
【讨论】:
我搜索了其他文章并通过openCV实现了SIFT。我使用 cv::SIFT siftDetectorExtractor = cv::SIFT(0, 3, 0.04, 10, 1.6);和 siftDetectorExtractor(tmp,cv::Mat(), keypoints1, sifts1);。但是,当我想知道关键点的协调时,我使用 keypoints1[0].pt 并且结果不是整数。为什么?图像是数字的,所以关键点的坐标必须是整数。 另外,我已经通过 sifts1.at欲了解更多信息:http://docs.opencv.org/2.3/modules/features2d/doc/common_interfaces_of_descriptor_extractors.html
【讨论】:
以上是关于使用openCV在图像中实现SIFT的主要内容,如果未能解决你的问题,请参考以下文章
有关meanshift跟踪的理解(在opencv中实现)(转载)