【问题标题】:OpenCV: SIFT detection and matching methodsOpenCV:SIFT检测和匹配方法
【发布时间】:2015-01-23 21:08:14
【问题描述】:

来自 OpenCV 文档:

C++:void SIFT::operator()(InputArray img, InputArray mask, vector<KeyPoint>& keypoints,
 OutputArray descriptors, bool useProvidedKeypoints=false)

参数:

img – Input 8-bit grayscale image
mask – Optional input mask that marks the regions where we should detect features.
keypoints – The input/output vector of keypoints
descriptors – The output matrix of descriptors. Pass cv::noArray() 
if you do not need them.
useProvidedKeypoints – Boolean flag. If it is true, the keypoint 
detector is not run. Instead, the provided vector of keypoints is
 used and the algorithm just computes their descriptors.

我有以下问题:

  1. mask 具有什么价值?我的意思是,如果我想删除图像边界附近的关键点,我应该给一个掩码,在边框和中心是零?

  2. 在另一个网页上,我发现了一种不同的方法,它使用“检测”方法来检测关键点,并使用“计算”​​方法来计算描述符。使用功能检测/计算与功能“操作员”有什么区别?使用第一种方法,我首先检测关键点而不计算描述符......但是,如果我使用带有useProvidedKeypoints 标志的“运算符”方法,我之前如何计算关键点?

    李>
  3. 另外,蛮力匹配和FLANN匹配在匹配点数上有什么区别?我需要使用 MATLAB 的VL_FEAT 库获得相同的结果...所以我想知道这两种方法中哪一种更接近

例如,下面的 Matlab 代码给出了 2546 个检测到的关键点

 [f1,d1] = vl_sift(frame1_gray);

使用 OpenCV:

std::vector<KeyPoint> keypoints;
cv::SiftFeatureDetector detector;
detector.detect(gray1, keypoints);
cout << keypoints.size() << endl;

只有708!!!

然后,使用 SIFT::operator() 我作为输入提供的参数有问题

std::vector<KeyPoint> keypoints;
Mat descriptors;
SIFT S = SIFT();
SIFT::operator(gray1, Mat(), keypoints, descriptors);

【问题讨论】:

    标签: matlab opencv image-processing computer-vision sift


    【解决方案1】:

    让我们一一回答您的问题:

    1. 蒙版是您指定的输入图像,以便您可以控制在哪里检测关键点。有时,您不想在整个图像上检测关键点,而是想定位要检测关键点的位置,或者定位图像的子部分以捕获关键点。之所以会出现这种情况,是因为可能会进行一些预处理来定位图像中的显着区域。例如,如果你想做人脸识别,你只想检测人脸的关键点,而不是整个图像。因此,您可能需要先大致了解人脸在图像中的位置,然后将关键点检测仅定位到这些区域。

    2. 检测和计算显然是两个不同的东西。检测是确定图像中的哪些像素位置是有效的关键点。计算描述这些特定位置的关键点。兴趣点检测器的成功不仅在于它们具有足够的可重复性和鲁棒性以被检测到,而且描述关键点的方法是它们受欢迎的原因。

      这分别暗示了检测器和描述符。有一些框架,例如 SIFT 和 SURF,它们既是检测框架又是描述框架。 SIFT / SURF 计算 128-bin 向量中的方向直方图(大致),并且还具有基于高斯差近似的检测框架。如果我可以建议一个链接,请看一下这个链接:Classification of detectors, extractors and matchers - 他们讨论了所有不同的检测器、描述符以及匹配关键点的方法。 useProvidedKeypoints(在 OpenCV 中:http://docs.opencv.org/2.4.1/modules/nonfree/doc/feature_detection.html#sift-operator)标志意味着您已经确定了要为其计算描述符的图像中的位置的像素位置。因此,SIFT 将绕过算法的检测阶段,它会简单地计算这些像素位置的描述符。

    3. Brute Force 和 FLANN(近似最近邻的快速库 - http://www.cs.ubc.ca/research/flann/)之间的区别在于 匹配 关键点的机制。对于给定的关键点,您要确定该关键点是否与图像中检测到的任何其他关键点匹配。一种方法是搜索所有关键点(蛮力)或子集关键点(FLANN)。 FLANN 在高维空间中执行最近邻搜索,因此它限制了您搜索关键点的位置。这显然会比蛮力快得多,但这完全取决于您的应用程序。

    【讨论】:

    • 感谢您的有用回复....但我希望有关于编码而不是理论的信息,例如在我的问题 2 中)我的意思是我想知道使用功能检测/计算与方法“操作员”
    • 您还应该更新您的问题。那个区域还不清楚。
    • 您的问题听起来也像是您了解理论并且关注兴趣点检测器的某些技术方面。如果不是这种情况,请再次更新您的问题。当您问一件事时,提供答案的人通常会感到沮丧,但您的真正意思是另一件事。
    • 我很抱歉..我已经更新了我的问题,也很抱歉我的英语
    猜你喜欢
    • 2014-04-04
    • 2017-04-28
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 2012-10-11
    • 2019-03-30
    相关资源
    最近更新 更多