軟體安裝——Ubuntu14.04+OpenCV3.1+contrib模組+測試
阿新 • • 發佈:2018-12-16
一、安裝opencv3.1+contrib
- 安裝依賴項
sudo apt-get install build-essential libgtk2.0-dev libvtk5-dev libjpeg-dev libtiff4-dev libjasper-dev libopenexr-dev libtbb-dev
- 檔案準備
-
把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
二、測試
- 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
- 結果