一、安装opencv3.1+contrib
- 安装依赖项
sudo apt-get install build-essential libgtk2.0-dev libvtk5-dev libjpeg-dev libtiff4-dev libjasper-dev libopenexr-dev libtbb-dev
- 文件准备
资源(opencv3.x + contrib + ippicv) 可到此处下载
-
把U盘的opencv3.1和contrib模块拷贝出来,解压opencv3.1把U盘的opencv3.1和contrib模块拷贝出来,解压opencv3.1
-
进opencv3.1目录,将contrib模块拷贝到该目录下,解压
-
如果你使用cuda,在解压完了之后修改graphcut.cpp文件中第45行的位置
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) || (CUDART_VERSION >= 8000) 保存 -
编译
进入opencv3.1目录下在opencv3.1目录下
mkdir release
cd release
cmake ..
这里出现ippicv的时候断掉,复制ippicv到对应目录3rdparty/ippicv/downloads/linux808b791a6eac9ed78d32a7666804320e下,继续cmake
cmake -DBUILD_TIFF=ON -D CMAKE_BUILD_TYPE=RELEASE -D OPENCV_EXTRA_MODULES_PATH=${HOME}/opencv-3.1.0/opencv_contrib-3.1.0/modules ..
然后
sudo make -j50
sudo make install
看OpenCV版本
pkg-config --modversion opencv
二、测试
- CMakeLists
cmake_minimum_required(VERSION 2.8)
project(TEST)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
# 寻找OpenCV库
FIND_PACKAGE( OpenCV REQUIRED )
# 添加头文件
INCLUDE_DIRECTORIES( ${OpenCV_INCLUDE_DIRS} )
MESSAGE(STATUS "OpenCV library status:")
MESSAGE(STATUS " version: ${OpenCV_VERSION}")
MESSAGE(STATUS " libraries: ${OpenCV_LIBS}")
MESSAGE(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
set( SOURCE_FILES main.cpp )
add_executable( test ${SOURCE_FILES} )
# 链接OpenCV库
TARGET_LINK_LIBRARIES( test ${OpenCV_LIBS} )
- cpp文件
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
using namespace cv;
using namespace std;
#define GOOD
int main(int argc, char* argv[]) {
if(argc != 3){
printf("Usage: test <image1_path> <image2_path>\n");
return -1;
}
// Create SIFT class pointer
Ptr<Feature2D> f2d = xfeatures2d::SIFT::create();
// load image
Mat img_1 = imread(argv[1]);
Mat img_2 = imread(argv[2]);
if (!img_1.data || !img_2.data){
printf("No image data.\n");
return -1;
}
// Detect the keypoints
vector<KeyPoint> keypoints_1, keypoints_2;
f2d->detect(img_1, keypoints_1);
f2d->detect(img_2, keypoints_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);
// Matching descriptor vector using BFMatcher
BFMatcher matcher;
vector<DMatch> matches;
matcher.match(descriptors_1, descriptors_2, matches);
// 绘制匹配出的关键点
Mat img_matches;
#ifdef GOOD
sort(matches.begin(), matches.end());
vector<KeyPoint> goodPts1, goodPts2;
vector<DMatch> matchesVoted;
for (int i = 0; i<10; i++)
{
DMatch dmatch;
dmatch.queryIdx = i;
dmatch.trainIdx = i;
matchesVoted.push_back(dmatch);
goodPts1.push_back(keypoints_1[matches[i].queryIdx]);
goodPts2.push_back(keypoints_2[matches[i].trainIdx]);
}
drawMatches(img_1, goodPts1, img_2, goodPts2, matchesVoted, img_matches, DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
#else
drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_matches);
#endif
imshow("【match key points】", img_matches);
imwrite("1_kps_result.jpg", img_matches);
// 等待任意按键按下
waitKey(8000);
return 0;
}
- 两张图片
- 编译运行
./test ../1.jpg ../2.jpg
- 结果