1. 程式人生 > >軟體安裝——Ubuntu14.04+OpenCV3.1+contrib模組+測試

軟體安裝——Ubuntu14.04+OpenCV3.1+contrib模組+測試

一、安裝opencv3.1+contrib

  1. 安裝依賴項
sudo apt-get install build-essential libgtk2.0-dev libvtk5-dev libjpeg-dev libtiff4-dev libjasper-dev libopenexr-dev libtbb-dev
  1. 檔案準備
  • 把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 

二、測試

  1. 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} )

  1. 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;
}

  1. 兩張圖片
  2. 編譯執行
./test ../1.jpg ../2.jpg
  1. 結果 在這裡插入圖片描述 在這裡插入圖片描述