繁体   English   中英

OpenCV:SIFT检测和匹配方法

[英]OpenCV: SIFT detection and matching methods

从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标志的方法“ operator”,那么我之前必须如何计算关键点?

  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);

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

  1. 面膜是您指定的,这样你可以控制关键点的检测发生的输入图像。 有时,您不想检测整个图像上的关键点,而是想定位要检测关键点的位置,或者找到图像的一个部分以捕获关键点。 之所以如此,是因为可能需要进行一些预处理才能在图像中定位显着区域。 例如,如果要进行人脸识别,则只希望检测人脸的关键点,而不是整个图像。 因此,可能有一个步骤,您首先要了解面部在图像中的位置,然后将关键点检测仅定位到这些区域。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM