想要使用OpenCV里面SIFT、SURF等检测算法,但听说都被统一集成到一个叫“Contrib”的模块里面了(关键是xFeatures2d.hpp)。于是去官网下载,重新编译覆盖安装了一下。
opencv的安装之前已经写过,这里补充额外模块的安装过程。
官网地址:
https://github.com/opencv/opencv_contrib/releases
查找对应的版本下载即可,注意要与OpenCV的自身版本对应。我使用的是3.1.0。
下载完成后,将压缩包里的源码解压到opencv目录的同一路径下。
进入先前编译opencv用的“build”文件夹(上图)。
cd build执行
sudo cmake -D CMAKE_INSTALL_PREFIX=/usr/local -D CMAKE_BUILD_TYPE=Release -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules ..注意后面“EXTRA_MODULES_PATH”选择了额外模块所在的路径。最后两个点(当前路径)不要漏!
继续执行
sudo makemake的过程比较长,半个小时。
最后执行
sudo make install这样就加入了额外模块对openCV进行了覆盖安装。
编译不报错,并且看到下面的信息,肯定就ok了。 库文件都可以在上图显示的路径里找到。
就用xfeatures2d来简单测试SIFT算法。代码如下:
SIFTextract.cpp
#include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/xfeatures2d.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv; using namespace std; int main(int argc,char** argv) { //创建SIFT类指针 Ptr<Feature2D>f2d = xfeatures2d::SIFT::create(); //读入灰度图 Mat img_1 = imread(argv[1],CV_LOAD_IMAGE_GRAYSCALE); //检测特征点 vector<Keypoint>keypoints_1; f2d->detect(img_1,keypoints_1); //计算描述子 Mat descriptors_1; f2d->compute(img_1,keypoints_1,descriptors_1); //输出显示 Mat outimg1; drawKeypoints(img_1,keypoints_1,outimg1,Scalar::all(-1),DrawMatchesFlags::DEFAULT); imshow("SIFT Features",outimg1); //等待按下按键 waitkey(0); return 0; }写个CMakeList来编译代码:
CMakeList.txt
cmake_minimum_required( VERSION 2.8) project( vo ) set( CMAKE_BUILD_TYPE "Release" ) set( CMAKE_CXX_FLAGS "-std=c++ -o3" ) include_directories( ${OpenCV_INCLUDE_DIRS} ) add_exetuable( SIFTextract SIFTextract.cpp ) target_link_libraries( SIFTextract ${OpenCV_LIBS} )代码、CMakeList、图片放在同一路径下,用Cmake编译:
sudo mkdir build cd build sudo cmake .. sudo make生成可执行项目。
代码所在路径执行
build/SIFTextract 1.png结果: