Windows環境下vs2015+opencv3.1+contrib庫安裝配置


 

最近幾天在安裝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);
}

顯示結果為:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM