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