解決這個問題,目的在於獲得並使用最新的完全版本的代碼,主要方法是對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( 0, 0, 255), DrawMatchesFlags : :DEFAULT);
imshow( "gray", gray);
waitKey( 0);
return 0 ;
}
# 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會有自己的顯示

感謝閱讀至此,希望有所幫助!
附件列表