最近幾天在安裝opencv,也看了網上的一些帖子,結合自己遇到的一些問題寫了點內容。
准備:
1. opencv最新的版本是3.10,可以到官網下載http://opencv.org/。官網下載提取后會得到兩個文件夾:build和sources。我們需要用到的是sources,用CMake重新編譯sources里的內容,再添加contrib庫。build里的內容是官網已經編譯好的,有其他博客是講利用build安裝的,而這里我們並未用到。opencv也可從GitHub下載https://github.com/opencv/opencv,這是源碼,相當於前述的sources文件夾。
2. CMake是用來編譯源碼的,官網下載https://cmake.org/。我使用的是
。使用CMake除了要opencv編譯源碼,還有一個原因是:opencv3.1版本只能調試x64,不能調試x86。也就是說要在32位環境下調試,需要自己用CMake重新編譯源碼。
3. contrib庫。官網上的opencv3.1包含的是穩定的核心庫,而一些不穩定的放到了contrib中。GitHub下載https://github.com/opencv/opencv_contrib。解壓后,我們用到的是modules文件夾。
4. 看見文件里有解壓包時,不要輕易打開。
開始:
1. 文件夾路徑,這個隨自己設置就行。我將准備內容里的東西都放在了D:\BUILD(以下都用#\代替)里,新建一個myopencv文件夾,來裝經CMake編譯后的內容,會得到如下圖的形式:

2. 在CMake編譯opencv源碼時,需要下載幾個文件,但一般很難下載而導致編譯失敗,所以直接將其拷到文件夾中。鏈接:http://pan.baidu.com/s/1c18V9Ck 密碼:bt7z。將downloads里三個文件夾中的文件拷貝到#\opencv\sources\3rdparty\ffmpeg下,會得到如下圖的形式:

將ippicv_win文件夾拷貝到#\opencv\sources\3rdparty\ippicv下,同時修改downloader.cmake,以記事本形式打開,刪掉末尾的“_icv_downloader()”
3. 在#\CMake\bin下打開cmake-gui.exe。在where is the source code輸入 #\opencv\sources,在where to build the binaries輸入 #\myopencv。會得到如下圖的形式:

然后點擊Configure,會出現編譯器選擇對話框

選擇Visual Studio 14 2015,這個編譯之后opencv3.1就能在x86(win32)環境下調試了。Visual Studio 14 2015 Win64對應的是x64。然后就是等待出現Configuring done,如下圖。

然后Search找到OPENCV_EXTRA_MODULES_PATH,輸入#\opencv_contrib_master\modules。再次點擊Configure,等出現Configuring done后,點擊Generate,之后會出現Generating done。到此為止編譯的工作已經完成了。
4. 在#\myopencv下找到OpenCV.sln文件,打開它。初始化之后右鍵 解決方案‘OpenCV’,選擇重新生成解決方案。這是在Debug、win32環境下生成的。此過程時間較長。然后找到CMakeTargets文件夾下的INSTALL文件,如下圖:
右鍵->僅用於項目->僅生成INSTALL。然后在#\myopencv下就會有一個install文件夾。
5. 配置環境變量。
環境變量設置。變量名:OPENCV;值:#\myopencv\install。
用戶變量設置。path下添加:#\myopencv\install\x86\vc14\bin。
6. 打開vs2015,新建一個工程。在屬性管理器里找到Microsoft.Cpp.Win32.uesr,如下圖:

右鍵->屬性,會彈出對話框。找到通用屬性->VC++目錄,如下圖:

在包含目錄里添加:
#\myopencv\install\include
#\myopencv\install\include\opencv
#\myopencv\install\include\opencv2
在庫目錄里添加:
#\myopencv\install\x86\vc14\lib
找到鏈接器->輸入->附加依賴項,如下圖:

在附加依賴項中添加內容(就是#\myopencv\install\x86\vc14\lib文件夾里面的lib文件,對照着添加就行):
opencv_bgsegm310d.lib
opencv_bioinspired310d.lib
opencv_calib3d310d.lib
opencv_ccalib310d.lib
opencv_core310d.lib
opencv_datasets310d.lib
opencv_dnn310d.lib
opencv_dpm310d.lib
opencv_face310d.lib
opencv_features2d310d.lib
opencv_flann310d.lib
opencv_fuzzy310d.lib
opencv_highgui310d.lib
opencv_imgcodecs310d.lib
opencv_imgproc310d.lib
opencv_line_descriptor310d.lib
opencv_ml310d.lib
opencv_objdetect310d.lib
opencv_optflow310d.lib
opencv_phase_unwrapping310d.lib
opencv_photo310d.lib
opencv_plot310d.lib
opencv_reg310d.lib
opencv_rgbd310d.lib
opencv_saliency310d.lib
opencv_shape310d.lib
opencv_stereo310d.lib
opencv_stitching310d.lib
opencv_structured_light310d.lib
opencv_superres310d.lib
opencv_surface_matching310d.lib
opencv_text310d.lib
opencv_tracking310d.lib
opencv_ts310d.lib
opencv_video310d.lib
opencv_videoio310d.lib
opencv_videostab310d.lib
opencv_xfeatures2d310d.lib
opencv_ximgproc310d.lib
opencv_xobjdetect310d.lib
opencv_xphoto310d.lib
至此,已經完成了所有工作。
測試:
重啟電腦,驗證一下是否已經OK。下面給出兩個代碼:
1. 第一個是顯示一幅圖像。將圖像放到所建的工程里
#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv; int main() { // 讀入一張圖片(游戲原畫) Mat img = imread("燈.jpg"); // 創建一個名為 "游戲原畫"窗口 namedWindow("游戲原畫"); // 在窗口中顯示游戲原畫 imshow("游戲原畫", img); // 等待6000 ms后窗口自動關閉 waitKey(6000); }
顯示結果為:

2. SIFT算法
#include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/xfeatures2d.hpp> using namespace cv; using namespace std; int main() { //Create SIFT class pointer Ptr<Feature2D> f2d = xfeatures2d::SIFT::create(); //讀入圖片 Mat img_1 = imread("4.jpg"); Mat img_2 = imread("5.jpg"); //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; drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_matches); imshow("【match圖】", img_matches); //等待任意按鍵按下 waitKey(600000); }
顯示結果為:

