使用openCV在图像中实现SIFT
我试图用openCV实现SIFT,并且我参考了这些链接link1和link2。此外,我还阅读了Lowe写的关于SIFT的论文。我对链接1和链接2中的代码有一些问题。使用openCV在图像中实现SIFT
-
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]。
我想修改我用来匹配图片的方法,所以我需要提取描述符和每个关键点的主导方向。如何提取每个关键点的描述符和主导方向?
非常感谢您的回复。
我的建议是,你应该在开始时使用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);
作为垫描述一个描述符的每一行。
如果您有任何问题,请让我知道! 希望这有助于。
- 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
我寻觅其他物品和实施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
此外,我已经通过sifts1.at(0,0)访问sifts1.at (0,127)描述符的第一个关键点。我是否需要将sifts1.at (0,0)的顺序在匹配前旋转到sifts1.at (0,127)和其他关键点的描述符?或者它的顺序是从主导方向开始,并自动结束在主导方向?所以我可以直接使用结果进行匹配。 –
Kuo
2014-12-05 15:25:19
此外,我仍然无法找到cv :: SiftDescriptorExtractor提取器()中参数的含义;你在我的学习中帮助我很多。非常感谢您的回复。 – Kuo 2014-12-05 15:27:41