使用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 =-1 %% actualNLayers。

    另外,我没有实现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(0,0) 到 sifts1.at(0,127) 访问了第一个关键点的描述符。我是否需要在匹配之前将 sifts1.at(0,0) 的顺序旋转到 sifts1.at(0,127) 和其他关键点的描述符?或者它的顺序是从主导方向开始并自动在主导方向结束?所以我可以直接用结果来匹配。 另外我还是找不到cv::SiftDescriptorExtractor extractor()中参数的含义;你的回答对我的学习很有帮助。非常感谢您的回复。 1. “协调”是什么意思?当您使用 keypoints1[0].pt 时,您将获得关键点的坐标(在 Point2f 结构中),而不是整数。 2. 检测到关键点(使用 SiftFeatureDetector)后,必须计算它们的描述符(使用 SiftDescriptorExtractor)。之后,您应该使用匹配器来连接每个图像中最近的关键点(如果是这种情况)。 1.但是数字图像中关键点的坐标或位置应该是整数。为什么是整数? 2.我不明白SiftDescriptorExtractor怎么用,link用3.0作为参数。这个参数是什么意思?在Lowe写的论文里找不到这个参数。【参考方案2】: cv::SiftFeatureDetector检测器(0.05, 5.0),第一个参数是对比度阈值。这是接受关键点的最小对比度。第二个参数是边缘拒绝阈值。如果您想获得更多功能,您应该增加第一个参数和/或减少第二个参数。 cv::SiftDescriptorExtractor extractor(3.0),参数为放大倍数,描述符大小由关键点比例乘以该值确定。使用前缀参数是可以的。

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

【讨论】:

以上是关于使用openCV在图像中实现SIFT的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OpenCV 中实现颜色分割和前景检测?

看OpenCV如何在python中实现图像检测!

SIFT openCV 的关键点数?

有关meanshift跟踪的理解(在opencv中实现)(转载)

在Opencv中实现Matlab的bwareaopen函数功能

光流(optical flow)和openCV中实现