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


解決這個問題,目的在於獲得並使用最新的完全版本的代碼,主要方法是對CMake能夠熟練使用,並且對編譯等基礎支持有所了解。

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

我提供一個制作課件過程中的.cache版本

鏈接: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就可以直接編譯了
3、最為重要的,也是和普通OpenCV代碼編譯不同的地方。其中OPENCV_EXTRA_MODULES_PATH 中要填入contrib-master下的modules目錄
特別是這個地方,要將OPENCV_ENABLE_NONFREE打開!!!
編譯生成的結果,能夠不飄紅就可以。
確定,兩次config,一次generate
四、代碼的編譯
打開vs環境,選中 批生成,生成install即可,其它的會自動調用(我非常推薦這樣做,因為經過實驗,這樣最省時間,而且達到效果)
根據機器性能,等待不同的時間
比較吃CPU
如果出現這個錯誤(我出現了這個錯誤)
 
應該是HDF5的問題,所以回過去將其去掉。
按照我這個方法,最后能夠直接成功的。
那么最終生成的文件在哪里?其實是在install中的
 
可以看到,已經按照容易使用的方式排列好了
 
這張圖能夠幫助看得更清楚:
我們最后需要的,顯然是.dll文件,它被放置在bin/release目錄下面
此外,我們還可以通過比較獲得一些信息(左邊是不帶contrib的,右邊是帶contrib的)
可以看到,無論是lib的大小,還是include中文件的數量,contrib都要大一些。
這個角度也是可以看到的。
五、在新項目中使用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會有自己的顯示
感謝閱讀至此,希望有所幫助!





附件列表

 


免責聲明!

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



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