原帖轉(zhuǎn)于csdn 為了以后的學(xué)習(xí)
https://blog.csdn.net/weixin_41695564/article/details/79925379
前言:
由于OpenCV功能越來(lái)越臃腫,OpenCV3改變了項(xiàng)目架構(gòu),使用內(nèi)核+插件的架構(gòu)形式。 因此,OpenCV從2.x到3.x是一個(gè)很大的轉(zhuǎn)變,對(duì)于很多功能不完善、性能不穩(wěn)定的模塊,都被放到了extra_modules(擴(kuò)展模塊)里面了。在Github中,除了存放正式版OpenCV的主倉(cāng)庫(kù)和新增加的OpenCV_extra倉(cāng)庫(kù)外,還添加了一個(gè)OpenCV_contrib的全新倉(cāng)庫(kù),功能有:臉部識(shí)別、文本識(shí)別、邊緣檢測(cè)、追蹤算法等,里面存放的是功能未穩(wěn)定的代碼,如果需要使用這些功能,就需要重新進(jìn)行編譯。
由于任務(wù)要求,需要把OpenCV的擴(kuò)展模塊中的xfeatures給包含進(jìn)來(lái),因此自己手動(dòng)編譯OpenCV3.1.0與其擴(kuò)展模塊實(shí)現(xiàn)。這個(gè)過(guò)程其實(shí)并不難,只要如下三步即可實(shí)現(xiàn)。在正式開(kāi)始之前,有些準(zhǔn)備工作需要做,就是下載OpenCV3.1.0還有其擴(kuò)展模塊,以及CMake GUI工具。在這里,我先貼出下載地址,大家如果有需要可以去上面下載。
OpenCV3.1.0下載地址:
https://sourceforge.net/projects/opencvlibrary/files/opencv-win/3.1.0/opencv-3.1.0.exe/download
OpenCV3.1.0安裝教程:
https://blog.csdn.net/qq_17550379/article/details/78201442
OpenCVcontrib下載地址:
https://github.com/opencv/opencv_contrib
cmake-gui下載地址(3.11.0): https://cmake.org/download/
一、下載OpenCV contrib
這里我事先已經(jīng)下載并配置好了VS2015和OpenCV3.1.0,所以我們直接下載OpenCVcontrib,進(jìn)入上面給出的網(wǎng)址,點(diǎn)擊releases,如下:

進(jìn)入releases以后:

由于我的OpenCV版本是3.1.0,因此我們下載對(duì)應(yīng)的zip壓縮文件到指定文件夾下,如下:

下載好以后我們對(duì)其進(jìn)行解壓縮:

進(jìn)入解壓后的文件夾下:

二、下載cmake-gui**
我們進(jìn)入網(wǎng)址,選擇win64位版本對(duì)應(yīng)的壓縮包,如下所示:

點(diǎn)擊下載:

下載好以后,我們對(duì)其進(jìn)行解壓縮:
然后我們?cè)贠penCV的安裝目錄下新建一個(gè)newbuild文件夾,用來(lái)存放編譯擴(kuò)展模塊后的生成文件:

打開(kāi)其bin目錄下的cmake-gui.exe工具:

運(yùn)行該程序,輸入如下目錄:

然后點(diǎn)擊Generate進(jìn)行編譯:

第一次導(dǎo)出時(shí)需要設(shè)置后面用來(lái)編譯此OpenCV.sln工程的VS的版本(這里特別要注意的是,自己機(jī)器上是否裝有相應(yīng)的VS版本,如果沒(méi)有裝,還是要編譯就會(huì)出錯(cuò),可能是找不到對(duì)應(yīng)的工具原因,以及選擇X86和X64),這里用的是VS 2015。

稍等片刻:

(1)真是天有不測(cè)風(fēng)云,人有悲歡離合,結(jié)果報(bào)錯(cuò):
Downloading opencv_ffmpeg.dll...
CMake Error at cmake/OpenCVUtils.cmake:895 (file):
file DOWNLOAD HASH mismatch
for file: [D:/OpenCV3.1/opencv/sources/3rdparty/ffmpeg/downloads/89c783eee1c47bfc733f08334ec2e31c/opencv_ffmpeg.dll]
expected hash: [89c783eee1c47bfc733f08334ec2e31c]
actual hash: [3f05c9b2e6866360eedb35ff3dddff65]
status: [28;"Timeout was reached"]
Call Stack (most recent call first):
3rdparty/ffmpeg/ffmpeg.cmake:10 (ocv_download)
cmake/OpenCVFindLibsVideo.cmake:206 (include)
CMakeLists.txt:536 (include)
CMake Error at cmake/OpenCVUtils.cmake:899 (message):
Failed to download opencv_ffmpeg.dll. Status=28;"Timeout was reached"
Call Stack (most recent call first):
3rdparty/ffmpeg/ffmpeg.cmake:10 (ocv_download)
cmake/OpenCVFindLibsVideo.cmake:206 (include)
CMakeLists.txt:536 (include)
仔細(xì)分析,其實(shí)是sources\3rdparty\ffmpeg\downloads目錄下的opencv_ffmpeg.dll,由于下載不成功導(dǎo)致以上錯(cuò)誤 。
于是我們自行下載這兩個(gè)文件:
下載網(wǎng)址如下
然后再將opencv_ffmpeg.dll放在目錄下
sources\3rdparty\ffmpeg\downloads\89c783eee1c47bfc733f08334ec2e31c
將opencv_ffmpeg_64.dll放在目錄
sources\3rdparty\ffmpeg\downloads\35fe6ccdda6d7a04e9056b0d73b98e76
(2)重新編譯,結(jié)果又發(fā)生錯(cuò)誤:
CMake Error at 3rdparty/ippicv/downloader.cmake:73 (file):
file DOWNLOAD HASH mismatch
for file:[D:/OpenCV3.1/opencv/sources/3rdparty/ippicv/downloads/windows-04e81ce5d0e329c3fbc606ae32cad44d/ippicv_windows_20151201.zip]
expected hash: [04e81ce5d0e329c3fbc606ae32cad44d]
actual hash: [f407b66b95729ddd35da423d75ba651a]
status: [28;"Timeout was reached"]
Call Stack (most recent call first):
3rdparty/ippicv/downloader.cmake:110 (_icv_downloader)
cmake/OpenCVFindIPP.cmake:237 (include)
cmake/OpenCVFindLibsPerf.cmake:12 (include)
CMakeLists.txt:537 (include)
CMake Error at 3rdparty/ippicv/downloader.cmake:77 (message):
ICV: Failed to download ICV package: ippicv_windows_20151201.zip.
Status=28;"Timeout was reached"
Call Stack (most recent call first):
3rdparty/ippicv/downloader.cmake:110 (_icv_downloader)
cmake/OpenCVFindIPP.cmake:237 (include)
cmake/OpenCVFindLibsPerf.cmake:12 (include)
CMakeLists.txt:537 (include)
Configuring incomplete, errors occurred!
See also "D:/OpenCV3.1/opencv/newbuild/CMakeFiles/CMakeOutput.log".
See also "D:/OpenCV3.1/opencv/newbuild/CMakeFiles/CMakeError.log".
仔細(xì)分析,原理是ippicv無(wú)法下載,我們自己手動(dòng)下載:
windows平臺(tái),將ippicv_windows_20151201.zip放在
sources\3rdparty\ippicv\downloads\windows04e81ce5d0e329c3fbc606ae32cad44d
將所有需要下載的文件都放到相應(yīng)的目錄,在開(kāi)始CMake,配置完成:

第一次編譯完成之后,我們需要將額外的opencv_contrib加到工程中進(jìn)行第二次編譯,在配置表中找到“OPENCV_EXTRA_MODULES_PATH”,設(shè)置其參數(shù)值為open_contrib源碼包中的modles目錄。一次之后如果還有紅色的塊,繼續(xù)configure,直到全部變白為止。 然后點(diǎn)擊Generate,回提示Generate Done。恭喜,完成了一半?。?!


編譯完成后,我們?cè)谫Y源管理器下查看上面設(shè)置的文件輸出目錄,發(fā)現(xiàn)目錄下多出了很多文件,其實(shí)就是OpenCV.sln工程文件:

三、配置VS生成install
> 用VS 2015打開(kāi)OpenCV.sln工程,在解決方案中可以查看工程目錄:

編譯生成debug版本的庫(kù),記得在此之前要選擇編譯的平臺(tái)信息,這就是編譯生成debug版本和release版本的區(qū)別,也可以選擇release,因?yàn)樽约旱墓こ炭赡芤玫较鄳?yīng)的動(dòng)態(tài)鏈接庫(kù)。
我們先對(duì)項(xiàng)目進(jìn)行重新生成解決方案:

等待一段時(shí)間,直至生成完畢:

找到CMakeTargets->INSTALL, 右鍵選擇生成install即可。這樣就會(huì)D:\OpenCV3.1\opencv\newbuild下面多出一個(gè)install的文件夾,到如果能成功生成,編譯就結(jié)束了。

等待幾分鐘:

然后,在工程目錄newbuild下的install目錄中,可以看到生成了一堆文件,這堆文件代表著編譯完成:

四、配置新的庫(kù)文件
重新配置OpenCV,新建一個(gè)項(xiàng)目打開(kāi),然后配置opencv工程屬性:

打開(kāi)屬性管理器:

雙擊圖中Microsoft.Cpp.Win32.use前面的扳手圖標(biāo),進(jìn)行配置:

設(shè)置可執(zhí)行文件目錄:

設(shè)置包含目錄:

包含以下文件目錄:
D:\OpenCV3.1\opencv\newbuild\include
D:\OpenCV3.1\opencv\newbuild\include\opencv
D:\OpenCV3.1\opencv\newbuild\include\opencv2
設(shè)置庫(kù)文件目錄:

設(shè)置庫(kù)目錄:

然后是附加依賴項(xiàng):
這里版本不同會(huì)有出入 放上我的3.2版本的庫(kù)文件
[opecv3.2]在里面粘貼如下庫(kù)文件:
opencv_aruco320d.lib
opencv_bgsegm320d.lib
opencv_bioinspired320d.lib
opencv_calib3d320d.lib
opencv_ccalib320d.lib
opencv_core320d.lib
opencv_datasets320d.lib
opencv_dnn320d.lib
opencv_dpm320d.lib
opencv_face320d.lib
opencv_features2d320d.lib
opencv_flann320d.lib
opencv_fuzzy320d.lib
opencv_highgui320d.lib
opencv_imgcodecs320d.lib
opencv_imgproc320d.lib
opencv_line_descriptor320d.lib
opencv_ml320d.lib
opencv_objdetect320d.lib
opencv_optflow320d.lib
opencv_phase_unwrapping320d.lib
opencv_photo320d.lib
opencv_plot320d.lib
opencv_reg320d.lib
opencv_rgbd320d.lib
opencv_saliency320d.lib
opencv_shape320d.lib
opencv_stereo320d.lib
opencv_stitching320d.lib
opencv_structured_light320d.lib
opencv_superres320d.lib
opencv_surface_matching320d.lib
opencv_text320d.lib
opencv_tracking320d.lib
opencv_video320d.lib
opencv_videoio320d.lib
opencv_videostab320d.lib
opencv_xfeatures2d320d.lib
opencv_ximgproc320d.lib
opencv_xobjdetect320d.lib
opencv_xphoto320d.lib
最后設(shè)置環(huán)境變量, 我的編譯生成的OpenCV v14/bin的目錄如下:
D:\OpenCV3.1\opencv\newbuild\install\x86\vc14\bin


五、代碼測(cè)試
為了測(cè)試擴(kuò)展模塊是否配置成功,我們編寫(xiě)測(cè)試代碼:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
using namespace cv::xfeatures2d;
int main( )
{
Mat img = imread("1.jpg", IMREAD_GRAYSCALE);
if (img.empty())
{
printf("could not load image...\n");
return -1;
}
namedWindow("原圖:", CV_WINDOW_AUTOSIZE);
imshow("原圖:", img);
int minHessian = 400;
Ptr<SURF> detector = SURF::create(minHessian);
vector<KeyPoint> keypoints;
detector->detect(img, keypoints);
Mat img_keypoints;
drawKeypoints(img, keypoints, img_keypoints, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
namedWindow("key points", CV_WINDOW_AUTOSIZE);
imshow("key points", img_keypoints);
waitKey(0);
return 0;
}
運(yùn)行代碼,結(jié)果如下:
