Windows環境下最新OpenCV和Contribute代碼的聯合編譯【20180926更新紅字】

解決這個問題, 目的在於得到並使用最新的徹底版本的代碼, 主要方法是對CMake可以熟練使用,而且對編譯等基礎支持有所瞭解。
由於這篇博客通過屢次修改,因此裏面的內容和配圖可能有不是徹底比對的地方,可是隻要加以理解,關鍵信息確定能夠Get到的,後面我會在所處視頻中對相關信息進行進一步整編,方便理解。
1、工具的準備
1 tortoisegit www.tortoisegit.org(可選)
2 CMake是一個跨平臺的安裝(編譯)工具,能夠用簡單的語句來描述全部平臺的安裝(編譯過程)。他可以輸出各類各樣的makefile或者project文件
3 vs2017
2、最新代碼的下載(OpenCV和Contribute分別下載)
Http直接下載
或者經過git下載
下載的結果解壓後放在一塊兒
3、代碼的make
Cmake將原始代碼make成爲你選擇的編譯器可以編譯的形式, 最新版本的cmake已是3.12了。
主要流程爲兩次Configure->一次Generate->Open Project打開vs進行編譯。參數的不一樣帶來告終果的不一樣。其中注意如下幾點
一、 64位和32位的選擇體如今選擇編譯器的時候是否選擇Win64。我認爲通常意義上說,32位的程序能夠以兼容模式運行在64位機器上,反過來不能夠。那麼也就是說32位以效能換取兼容性。 使用時根據實際狀況選擇。建議新手從32位開始
二、 靜態庫和動態庫的選擇體如今是否選擇BUILD_SHARED_LIBS(默認是選中的)。若是選擇靜態庫,那麼最後生成的程序和支持庫是打包到一塊兒的,交付起來比較方便;若是是動態庫則是分開的。效能問題沒有研究過。新上手的選擇 默認動態庫 。同時建議將BUILD_opencv_world選中,這樣最後的結果是一個文件。
這個過程當中,會下載較多東西,統一下載在.cache文件夾中

我提供一個製做課件過程當中的.cache版本ios

連接:https://pan.baidu.com/s/1440uWXUVaiDLFUqc6AF56A 
提取碼:v5e7

這裏,值得注意的一點是,選擇的項目,能夠經過搜索的方式進行加速,好比我在cmake中輸入"worl",將自動導航到"BUILD_opencv_world"條目中來。
這個地方,須要多說一句,CMAKE這個地方是最容易出現問題的地方,一方面是由於CMAKE這裏的信息不少,你們有可能會感到沒法適應;一方面是由於CMAKE你們接觸的比較少,不是很熟悉;再加上CMAKE的過程當中,有時須要再從網絡上下載一些東西,若是網絡很差的話,也會致使失敗。在前期的視頻中,我總結的具體方法爲:"兩次Config,一次Generate"這裏加以補充:
a、 Config的目的主要是讓你對CMAKE裏面的相關內容進行選擇的,第一次Config是把全部須要配置的項目顯示出來,而後你進行修改(就是打鉤子和去掉鉤子),第二次config是爲了配置你修改後的內容
全部紅色的內容都是能夠修改的
b、 須要關注的地方,是下面,最好不要有紅色,至少不要有error
c、 generate就是生成能夠被編譯器編譯的項目,這樣咱們打開vs2017就能夠直接編譯了
三、最爲重要的,也是和普通OpenCV代碼編譯不一樣的地方。其中OPENCV_EXTRA_MODULES_PATH 中要填入contrib-master下的modules目錄
特別是這個地方,要將OPENCV_ENABLE_NONFREE打開!!!
編譯生成的結果,可以不飄紅就能夠。
肯定,兩次config,一次generate
4、代碼的編譯
打開vs環境,選中 批生成,生成install便可,其它的會自動調用(我很是推薦這樣作,由於通過實驗,這樣最省時間,並且達到效果)
根據機器性能,等待不一樣的時間
比較吃CPU
若是出現這個錯誤(我出現了這個錯誤)

應該是HDF5的問題,因此回過去將其去掉。
按照我這個方法,最後可以直接成功的。
那麼最終生成的文件在哪裏?實際上是在install中的

能夠看到,已經按照容易使用的方式排列好了

這張圖可以幫助看得更清楚:
咱們最後須要的,顯然是.dll文件,它被放置在bin/release目錄下面
此外,咱們還能夠經過比較得到一些信息(左邊是不帶contrib的,右邊是帶contrib的)
能夠看到,不管是lib的大小,仍是include中文件的數量,contrib都要大一些。
這個角度也是能夠看到的。
5、在新項目中使用OpenCV
將須要的東西放到一塊兒
動態庫模式:
在VC++目錄中設定"包含目錄"爲include地址;"庫目錄"爲提供的lib地址。注意這裏的lib地址只是提供了接口信息。
連接器->輸入 填入lib名稱
將dll文件拷貝到PATH目錄可以指向的地方,好比"C:\Windows\System", 這個具體的位置只和編譯的時候相關,因此多試幾回就會找到,通常來講都是system裏面     
注意在交付的時候須要將支持的dll文件一併提供。
靜態庫修改 (注意靜態庫和動態庫選擇其一便可)
設置Include
設置引入"常規 附加庫目錄"
設置lib(注意填全,不只僅是opencv_word,注意後面.lib也要寫)
注意,須要將"代碼生成"的"運行庫"改成"多線程調試"。這樣就將MFC本身的支持庫包含在最後生成的exe中了。
若是想要在程序設計的過程當中,可以直接修改OpenCV本身的代碼,添加相關功能,首先將Opencv項目引入
然後添加引用設置項目依賴,就能夠直接在項目中修改OpenCV的代碼,生成符合本身要求的專用類庫。更能夠經過Pull/request的方法直接申請提交。
    
最後,編寫代碼的時候,頭文件和命名空間要選擇正確,由於咱們實現的是shift,因此須要作一個shift操做:


目前從結果來看
// opencvtest.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。
# include  "pch.h"
# include  <iostream >
# include  <opencv2 /core /utility.hpp >
# include  "opencv2/video/tracking.hpp"
# include  "opencv2/imgproc.hpp"
# include  "opencv2/videoio.hpp"
# include  "opencv2/highgui.hpp"
# include  "opencv2/xfeatures2d.hpp"
# include  <iostream >
# include  <ctype.h >
using  namespace cv;
using  namespace std;
using  namespace xfeatures2d;
int main()
{
    Mat matSrc  = imread( "e:/template/lena.jpg");
    Mat gray;
    Mat draw;
    cvtColor(matSrc, gray, COLOR_BGR2GRAY);
    Mat descriptors;
    std : :vector <KeyPoint > keypoints;
     // 生產sift結構
    Ptr <SiftFeatureDetector > siftFD  = SiftFeatureDetector : :create();
    siftFD - >detectAndCompute(gray, Mat(), keypoints, draw);
    drawKeypoints(gray, keypoints, gray, Scalar( 00255), DrawMatchesFlags : :DEFAULT);
    imshow( "gray", gray);
    waitKey( 0);
     return  0 ;
}
若是配置錯誤,opencv會有本身的顯示
感謝閱讀至此,但願有所幫助!




附件列表

相關文章
相關標籤/搜索