1. 程式人生 > >Windows環境下最新OpenCV和Contribute代碼的聯合編譯【20190505更新紅字】

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

space 普通 都是 命名空間 不同 family 推薦 一般來說 程序

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

這裏,值得註意的一點是,選擇的項目,可以通過搜索的方式進行加速,比如我在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(0, 0, 255), DrawMatchesFlags::DEFAULT);
imshow("gray", gray);
waitKey(0);
return 0 ;
}
如果配置錯誤,opencv會有自己的顯示技術分享圖片感謝閱讀至此,希望有所幫助!

來自為知筆記(Wiz)

附件列表

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