如何在OpenCV 3.0中使用带有c ++的SIFT?

时间:2014-12-17 19:21:11

标签: c++ opencv sift opencv3.0

我有OpenCV 3.0,我编译过&使用opencv_contrib模块安装它,这样就不会有问题。不幸的是,以前版本中的示例不适用于当前版本,因此虽然这个问题有already been asked more than once,但我想要一个更实际的例子,我可以实际使用它。即使official examples不适用于此版本(功能检测有效但其他功能示例无效),他们仍然会使用SURF。

那么,我如何在C ++上使用OpenCV SIFT?我想抓住两个图像中的关键点并匹配它们,类似于this example,但即使只是得到点和描述符也足够了。救命啊!

2 个答案:

答案 0 :(得分:40)

  1. 获取opencv_contrib repo
  2. 在那里花些时间阅读自述文件,将其添加到 opencv cmake设置
  3. 在主opencv repo中重新运行cmake / make / install
  4. 然后:

       #include "opencv2/xfeatures2d.hpp"
    
      // 
      // now, you can no more create an instance on the 'stack', like in the tutorial
      // (yea, noticed for a fix/pr).
      // you will have to use cv::Ptr all the way down:
      //
      cv::Ptr<Feature2D> f2d = xfeatures2d::SIFT::create();
      //cv::Ptr<Feature2D> f2d = xfeatures2d::SURF::create();
      //cv::Ptr<Feature2D> f2d = ORB::create();
      // you get the picture, i hope..
    
      //-- Step 1: Detect the keypoints:
      std::vector<KeyPoint> keypoints_1, keypoints_2;    
      f2d->detect( img_1, keypoints_1 );
      f2d->detect( img_2, keypoints_2 );
    
      //-- Step 2: Calculate descriptors (feature vectors)    
      Mat descriptors_1, descriptors_2;    
      f2d->compute( img_1, keypoints_1, descriptors_1 );
      f2d->compute( img_2, keypoints_2, descriptors_2 );
    
      //-- Step 3: Matching descriptor vectors using BFMatcher :
      BFMatcher matcher;
      std::vector< DMatch > matches;
      matcher.match( descriptors_1, descriptors_2, matches );
    

    另外,请勿忘记链接opencv_xfeatures2d!

答案 1 :(得分:0)

有一些有用的答案,但是我会添加我的版本(对于OpenCV 3.X,是 ),以防万一以上内容不清楚(经过测试):

  1. 将opencv从https://github.com/opencv/opencv克隆到主目录
  2. 将opencv_contrib从https://github.com/opencv/opencv_contrib克隆到主目录
  3. 在opencv内,创建一个名为build的文件夹
  4. 使用此CMake命令激活非自由模块:cmake -DOPENCV_EXTRA_MODULES_PATH=/home/YOURUSERNAME/opencv_contrib/modules -DOPENCV_ENABLE_NONFREE:BOOL=ON ..请注意,我们显示了contrib模块所在的位置,并且还激活了非自由模块
  5. 之后再进行makemake install

以上步骤应适用于OpenCV 3.X

之后,您可以使用带有适当标志的g ++运行以下代码:

g++ -std=c++11 main.cpp `pkg-config --libs --cflags opencv` -lutil -lboost_iostreams -lboost_system -lboost_filesystem -lopencv_xfeatures2d -o surftestexecutable

不要忘记的重要事情是,将xfeatures2D库与 -lopencv_xfeatures2d 链接在一起,如命令所示。 main.cpp文件是:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "opencv2/xfeatures2d.hpp"
#include "opencv2/xfeatures2d/nonfree.hpp"

using namespace cv;
using namespace std;

int main(int argc, const char* argv[])
{

    const cv::Mat input = cv::imread("surf_test_input_image.png", 0); //Load as grayscale

    Ptr< cv::xfeatures2d::SURF> surf =  xfeatures2d::SURF::create();
    std::vector<cv::KeyPoint> keypoints;
    surf->detect(input, keypoints);

    // Add results to image and save.
    cv::Mat output;
    cv::drawKeypoints(input, keypoints, output);
    cv::imwrite("surf_result.jpg", output);


    return 0;
}

这应该创建并保存带有冲浪关键点的图像。