OpenCV 3.3在8月3號正式Release,帶來了許多優(yōu)化改進(jìn)和新特性,包括備受關(guān)注的深度神經(jīng)網(wǎng)絡(luò)(DNN)模塊被正式引入主倉庫,標(biāo)志著OpenCV對DNN有了更深層次的優(yōu)化與支持; 支持通過宏ENABLE_CXX11啟用對C++ 11特性的支持;默認(rèn)包含大量SSE4.X和AVX/AVX2指令集優(yōu)化;內(nèi)置Intel IPP版本升級至2017.2,官方測試顯示有近15%的性能提升...等等,更多細(xì)節(jié)可以參考,另外如果你現(xiàn)有代碼基于OpenCV 3.x的話,建議進(jìn)行版本升級~
編譯OpenCV的源碼并不復(fù)雜,或者說十分簡單(相對于部分老項(xiàng)目而言),并且對Visual Studio的支持也很友好,但首次編譯的話對整個(gè)流程以及過程中一些開關(guān)可能會存在一些疑問。如果你不想自行編譯也可以使用官方預(yù)編譯好的文件,但是有些模塊可能是用不到的,所以我們還是希望能盡可能自定義模塊。
本文假設(shè)讀者已經(jīng)安裝了 CMake 和 Python (2.x或3.x)
????一、準(zhǔn)備資源
opencv-3.3.0-vc14.exe,建議使用sourceforge下載,因?yàn)橄啾萭ithub這玩意有直鏈并且有不同鏡像可選,可以直接使用第三方下載器下載,速度比較快。
????二、準(zhǔn)備源碼
直接運(yùn)行下載好的exe,選擇解壓到的目錄,并提取sources文件夾,目錄結(jié)構(gòu)大概如下:
?
?
?
????三、生成項(xiàng)目
打開CMake GUI,設(shè)定好目錄選擇Configure,然后選好IDE(Visual Studio 2017 WIN64)并Finish,等待初始配置完成(生成cvconfig.h)...
?
正常情況下直到Configuring done是不會發(fā)生錯(cuò)誤的,然后上面配置項(xiàng)是紅色的,提示有些東西需要人工改動(dòng),基本步驟就是查看輸出,如果發(fā)現(xiàn)有外部庫找不到,比如"A library with XXX API not found"或者"Could NOT find XXX (missing XXX)"之類的,根據(jù)需求把相應(yīng)的庫的路徑加上,或者不需要的話直接去掉相關(guān)依賴的編譯,還可以做到0 warnings多好的事情~
這里大概有幾個(gè)提示:
首先因?yàn)槲覀兪钱?dāng)成庫使用,不會去調(diào)試OpenCV本身,所以把和最后開發(fā)無關(guān)的開關(guān)關(guān)掉,比如BUILD_DOCS,BUILD_EXAMPLES,BUILD_XXX_TESTS,BUILD_opencv_ts(一些單元測試代碼),BUILD_PACKAGE (CPACK_BINARY_XXX,CPACK_SOURCE_XXX),INSTALL_XXX
前面說了C++ 11特性支持,當(dāng)然是選擇打開它,ENABLE_CXX11
為了方便項(xiàng)目配置和調(diào)試,在生產(chǎn)環(huán)境中建議打開BUILD_opencv_world,把各OpenCV模塊編譯成一個(gè)世界模塊,這樣最后生成的只有一個(gè).lib或者.dll(后者需要打開BUILD_SHARED_LIBS開關(guān)),但在發(fā)行版本中建議按需引入相應(yīng)模塊以減少體積(除非你每個(gè)模塊都有使用到)。
如果你不涉及音視頻處理,可以關(guān)掉相關(guān)模塊,大概包括BUILD_opencv_video,BUILD_opencv_videoio,BUILD_opencv_videostab,WITH_1394,WITH_GSTREAMER_XXX
部分編譯開關(guān)解釋
模塊 功能
BUILD_opencv_superres?基于視頻的圖像超分辨率重建,通過系列低分辨率圖像得到高分辨率圖像,,這里附上兩篇很好玩的文章,小心開車,提高駕駛技術(shù):用GAN去除(愛情)動(dòng)作片中的馬賽克和衣服,用一個(gè)玩具例子說明基于視頻的超分辨率重建的基本思想?
BUILD_JASPER?編譯3rdparty/libjasper項(xiàng)目用于?JPEG-2000圖像編解碼支持,~frodo/jasper/?
BUILD_OPENEXR?編譯3rdparty/openexr項(xiàng)目用于HDR圖像編解碼支持,?
WIHT_IPP?添加Intel IPP算法加速支持,包含SSE、AVX/AVX2等SIMD系列指令集優(yōu)化以及Intel的黑科技,在AMD核上同樣可用,但是加速效果不如Intel CPU明顯?
WIHT_IPP_A?添加Intel? IPP Asynchronous C/C++異步支持,非內(nèi)置需要額外安裝,?
BUILD_IPP_IW?編譯Intel IPP集成包裝,Intel(R) Integrated Performance Primitives Integration Wrappers?
BUILD_ITT / WITH_ITT?編譯/添加Intel? Instrumentation and Tracing Technology (Intel? ITT)支持,代碼性能檢測用,比如游戲開發(fā)中關(guān)鍵性能數(shù)據(jù)收集,因?yàn)镮TT API 有開銷,不需要的可以關(guān)閉?
WITH_LAPACK?添加線性代數(shù)軟件包LAPACK(Linear Algebra PACKage)支持,其包含了大部分計(jì)算科學(xué)中常見的數(shù)值線性代數(shù)問題求解支持,依賴于基本線性代數(shù)運(yùn)算庫BLAS (Basic Linear Algebra Subprograms),并未內(nèi)置?
WITH_1394?添加對計(jì)算機(jī)標(biāo)準(zhǔn)接口IEEE1394的支持,俗稱火線接口,是由APPLE和TI公司開始的高速串行接口標(biāo)準(zhǔn),主要用于視頻的采集,在INTEL高端主板與數(shù)碼攝像機(jī)(DV)上可見?
WITH_EIGEN?添加C++線性代數(shù)模版庫Eigen(C++ template library for linear algebra)的支持,其包含矩陣、向量、矢量數(shù)值運(yùn)算、數(shù)值分析及相關(guān)線性代數(shù)算法?
WITH_GSTREAMER?添加開源多媒體框架GStreamer(open source multimedia framework)的支持,其目標(biāo)在于簡化音/視頻應(yīng)用程序開發(fā),支持范圍從簡單的Ogg/Vorbis音頻播放、音/視頻流技術(shù)到復(fù)雜的混合音頻、視頻(非線性編輯)處理等?
WITH_VTK?添加可視化開發(fā)工具包VTK(The Visualization Toolkit)的支持,依賴自三維可視化引擎模塊opencv_viz?
OPENCV_ENABLE_NONFREE?啟用專利保護(hù)算法的支持,如SIFT和SURF,從功能上來說這兩個(gè)算法屬于opencv_features2d模塊,但由于它們都是受專利保護(hù)的,想在項(xiàng)目中可能需要專利方許可)
部分OpenCV模塊介紹
模塊 功能
opencv_core?包含核心功能尤其是底層數(shù)據(jù)結(jié)構(gòu)和算法實(shí)現(xiàn),定義基本數(shù)據(jù)結(jié)構(gòu)(包括重要的Mat)及被其他模塊所使用的基本函數(shù)?
opencv_imgproc?即Image Processing圖像處理,包括濾波(線性、非線性)、幾何變換、顏色空間變換、直方圖、形狀描述子等?
opencv_highgui?高層用戶接口(UI)及與QT框架的整合,包含讀寫圖像、視頻以及操作用戶圖形界面相關(guān)的函數(shù)?
opencv_imgcodecs?編解碼圖像的封裝接口,支持的格式取決于編譯時(shí)指定的解碼器,比如BUILD_TIFF打開對TIFF圖像的編解碼支持?
opencv_feature2d?用于2D特征檢測(角點(diǎn)對象和平面對象)、特征描述與匹配,包含各種接口統(tǒng)一的特征值檢測器及描述子?
opencv_calib3d?攝像機(jī)校準(zhǔn),包含相機(jī)標(biāo)定(去除相機(jī)自身缺陷導(dǎo)致的畫面形變),3D信息重建,姿態(tài)估計(jì),雙目幾何及立體視覺函數(shù)等?
opencv_photo?包含計(jì)算攝影學(xué),涉及修復(fù)/去噪/高動(dòng)態(tài)范圍(HDR)圖像等?
opencv_stitching?用于圖像拼接、制作全景圖?
opencv_videoio?對于視頻捕獲和視頻編碼器是一個(gè)易用接口?
opencv_videostab?Video Stabilization,視頻穩(wěn)像?
opencv_video?提供視頻分析功能(運(yùn)動(dòng)分析估計(jì)、背景分離、目標(biāo)跟蹤、卡爾曼濾波等)?
opencv_objdetect?用于對象檢測,包含Haar分類器、SVM檢測器、文字檢測以及預(yù)定義檢測器實(shí)例(例如人臉、眼、車等檢測)?
opencv_ml?機(jī)器學(xué)習(xí)模塊,包括統(tǒng)計(jì)模型、K最近鄰、支持向量機(jī)、決策樹、神經(jīng)網(wǎng)絡(luò)等經(jīng)典的機(jī)器學(xué)習(xí)算法。?
opencv_flann?Fast Library for Approximate Nearest Neighbors,最近鄰庫,包含聚類(K-means)、搜索(KDTree)和計(jì)算幾何等?
opencv_shape?形狀距離和匹配算法模塊,用于描述形狀、比較形狀,依賴于opencv_video?
opencv_superres?基于視頻的超分辨率重建,即從許多幀連續(xù)的低分辨率圖像中重建出高分辨率圖像,恢復(fù)單幀低分辨率圖像中丟掉的細(xì)節(jié)?
opencv_dnn?深度神經(jīng)網(wǎng)絡(luò),參考官方文檔Deep-Learning-in-OpenCV
知道了上述內(nèi)容也就對OpenCV整體框架有所了解了,自定義完OpenCV編譯模塊后我們再次點(diǎn)擊Configure修改配置,CMake應(yīng)該就沒錯(cuò)誤輸出也不顯示紅色了,然后點(diǎn)擊Generate生成VS2017項(xiàng)目文件,最后Open Project打開就能回到熟悉的VS環(huán)境中了,直接右鍵解決方案等它Build完就好了(ps: 生成的文件放在 build\lib\ 和 build\bin\ 目錄下,最后通過INSTALL這個(gè)項(xiàng)目把相關(guān)文件(.h、.dll、.lib等)拷貝到CMAKE_INSTALL_PREFIX目錄,如果你沒有Build INSTALL這個(gè)項(xiàng)目是不會拷貝的,跟make之后沒執(zhí)行make install情況一樣)。
????四、項(xiàng)目配置
VS作為幾乎公認(rèn)的宇宙最強(qiáng)IDE,在項(xiàng)目配置上具有十分友好的用戶接口,支持導(dǎo)出項(xiàng)目模版或者繼承項(xiàng)目屬性表.props,避免項(xiàng)目的重新配置以及過度依賴系統(tǒng)環(huán)境變量。因?yàn)槔^承項(xiàng)目屬性表方式相對而言比較靈活,這里大概講講怎樣配置一個(gè)OpenCV的公共項(xiàng)目屬性表,以后新建項(xiàng)目或者移動(dòng)OpenCV目錄只需要引用或者修改這個(gè)文件就行了,不需要改動(dòng)其它配置。
在VS主界面選擇View->Property Manager打開屬性管理器視圖,選擇你要配置的任一個(gè)項(xiàng)目,選中全部配置(Debug & Release,這是為了讓全部配置都繼承同一個(gè)屬性表),右鍵,在彈出的框選擇Add New Project Property Sheet進(jìn)行新建屬性表 (可以看到引用現(xiàn)有屬性表操作類似,但是我們還沒有屬性表,所以得新建一個(gè)):
然后右鍵我們剛才新建的屬性表打開屬性設(shè)置,可以看到和項(xiàng)目屬性設(shè)置界面差不多,就是多了個(gè)User Macros,這是用來添加自定義變量的,我們隨便添加一個(gè)OPENCV_INSTALL_DIR,結(jié)果如下:
接著在VC++ Directories分別設(shè)置Include和Library目錄 (Evaluated value如果沒顯示出路徑,請檢查上一步操作添加的變量名是否正確保存了;此外記得勾選從父項(xiàng)目繼承,Inherit from parent or project defaults):
Include目錄:$(OPENCV_INSTALL_DIR)\include
Library目錄:$(OPENCV_INSTALL_DIR)\$(PlatformShortName)\vc15\lib?(vc15比較坑,因?yàn)椴]有宏的值是vc15或15)
Include目錄配置示例
Library目錄配置示例
最后記得保存就好了,以后新項(xiàng)目只需要引用剛才新建的屬性表就好了。然后在項(xiàng)目中引用相應(yīng)的lib,但是lib有兩種版本,這里提供一個(gè)很方便的宏:
#ifdef _DEBUG # define RLIB_IMPORT_LIBRARY(a) __pragma(comment(lib, a "d.lib")) #else # define RLIB_IMPORT_LIBRARY(a) __pragma(comment(lib, a ".lib")) #endif // _DEBUG // 用法如下 RLIB_IMPORT_LIBRARY("opencv_world320") // world 其實(shí)是 All In One // RLIB_IMPORT_LIBRARY("opencv_core330") // RLIB_IMPORT_LIBRARY("opencv_highgui330") // RLIB_IMPORT_LIBRARY("opencv_imgproc330") // RLIB_IMPORT_LIBRARY("opencv_imgcodecs330") // RLIB_IMPORT_LIBRARY("opencv_features2d330") // RLIB_IMPORT_LIBRARY("opencv_calib3d330") // RLIB_IMPORT_LIBRARY("opencv_objdetect330") 最后一個(gè)問題就是如果你編譯的不是靜態(tài)庫而是DLL的話,建議把路徑 D:\OpenCV3.3\build\install\x64\vc15\bin加到系統(tǒng)環(huán)境變量PATH里,方便調(diào)試,省得每次拷貝DLL到應(yīng)用程序目錄。
評論