配置opencv

原帖轉(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,如下:

下載contribe

進(jìn)入releases以后:

release

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

zip

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

解壓

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

解壓后.png

二、下載cmake-gui**

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

cmake下載

點(diǎn)擊下載:

下載

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

然后我們?cè)贠penCV的安裝目錄下新建一個(gè)newbuild文件夾,用來(lái)存放編譯擴(kuò)展模塊后的生成文件:

解壓后

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

camake-gui

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

運(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。

注意版本

稍等片刻:

微信截圖_20180911191559.png

(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)址如下

https://raw.githubusercontent.com/Itseez/opencv_3rdparty/8aeefc4efe3215de89d8c7e114ae6f7a6091b8eb/ffmpeg/opencv_ffmpeg.dll

https://raw.githubusercontent.com/Itseez/opencv_3rdparty/8aeefc4efe3215de89d8c7e114ae6f7a6091b8eb/ffmpeg/opencv_ffmpeg_64.dll

然后再將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)下載:

下載地址如下
https://raw.githubusercontent.com/Itseez/opencv_3rdparty/81a676001ca8075ada498583e4166079e5744668/ippicv/ippicv_windows_20151201.zip

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。恭喜,完成了一半?。?!

配置ing
peizhiing

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

查看目錄

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

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é)束了。

install

等待幾分鐘:


完成

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


微信截圖_20180911193440.png

四、配置新的庫(kù)文件

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


opencv工程屬性

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

opencv工程屬性

雙擊圖中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ù)文件目錄:

庫(kù)目錄

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

庫(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

微信截圖_20180911194009.png
微信截圖_20180911194014.png

五、代碼測(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é)果如下:

SURF特征匹配效果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容