一. 背景
目前維護的某個計畫是在 Windows 下執行的,並且使用了 OpenCV 4.5.2 版本。
我原生的開發環境是 Mac 並使用了比較新的 OpenCV 4.8.1 版本。為了和本地開發環境保持一致,我打算對計畫中使用的 OpenCV 進行升級,因為該計畫還是用了擴充套件模組的一些功能,所以需要自行編譯。
本文只是記錄自己在編譯時踩過的坑,避免下次再犯或者給有需要的人。
二. 需要準備的軟體
CMake 3.13 或者以上版本 https://cmake.org/
Visual Studio 2022 社群版本 https://visualstudio.microsoft.com/zh-hans/vs/
OpenCV 4.8.1 源碼包 https://github.com/opencv/opencv/releases/tag/4.8.1
OpenCV 4.8.1 擴充套件模組源碼包 https://github.com/opencv/opencv_contrib/releases/tag/4.8.1
三. 編譯
3.1 使用 CMake
3.1.1 準備工作
解壓 OpenCV4.8.1 源碼包和擴充套件模組源碼包到某個位置
開啟 cmake-gui,設定 OpenCV4.8.1 源碼的位置和輸出編譯的二進制檔的位置
3.1.2 Configure
點選"Configure",彈窗會顯示build目錄沒有建立,是否需要建立。
點選「Yes"之後,CMake 會讓你選擇使用什麽工具來生成這個計畫。我們采用 Visual Studio 2022。
"Configure"配置成功後,會出現這個界面
此時,我們可以設定擴充套件模組的路徑
擴充套件模組的路徑在設定時, 一定要到 modules 這個資料夾 ,否則後面再次"Configure"會失敗。
如果需要編譯 OpenCV World 模組,也需要在這裏單獨設定。
World 模組是一個超級模組(super-module),它結合了使用者選擇的所有其它模組。它是一個一體化(all-in-one)模組,具有所有庫的功能。
然後再次點選"Configure"。
此時,最好看一下 CMake 的下載日誌,下面的檔是 CMake 的下載日誌。
某些檔的無法下載可能會最終導致 OpenCV World 模組無法編譯成功。
我主要是修改這幾個地方:
a. 進入 C:/opencv-4.8.1/opencv-4.8.1/3rdparty/ippicv 目錄 將 ippicv.cmake 的 https://raw.githubusercontent.com 修改為:https://raw.staticdn.net
b. 進入 C:/opencv-4.8.1/opencv-4.8.1/3rdparty/fmpeg 目錄 將 ffmpeg.cmake 的 https://raw.githubusercontent.com 修改為:https://raw.staticdn.net
c. 進入 C:/opencv_contrib-4.8.1/opencv_contrib-4.8.1/modules/xfeatures2d/cmake 目錄 將 download_boostdesc.cmake 中的https://raw.githubusercontent.com 修改為:https://raw.staticdn.net
d. 進入 C:/opencv_contrib-4.8.1/opencv_contrib-4.8.1/modules/xfeatures2d/cmake 目錄 將 download_vgg.cmake 中的 https://raw.githubusercontent.com 修改為:https://raw.staticdn.net
e. 進入 C:/opencv_contrib-4.8.1/opencv_contrib-4.8.1/modules/face 目錄 修改 CMakeLists.txt, 將https://raw.githubusercontent.com 修改為:https://raw.staticdn.net
之後再重新"Configure"即可。
3.1.3 Generate
接下來,點選"Generate"生成使用 CMake 構建的計畫
3.1.4 Open Project
最後點選"Open Project",喚起 Visual Studio 2022 開啟該計畫。
當然也可以去輸出編譯的二進制檔的目錄(C:/opencv-4.8.1/newbuild) ,開啟 OpenCV.sln 檔達到同樣的效果。
3.2 使用 Visual Studio 2022
在編譯之前,先配置 opencv_world 模組,然後選擇 release 或者 debug。
找到 CMakeTargets,選擇 ALL_BUILD 進行生成。
上述步驟生成成功後,選擇 INSTALL 進行生成。
INSTALL 生成成功後,這次編譯算是大功告成了。我們完成了OpenCV4.8.1 及其擴充套件模組的編譯。
我們可以在輸出編譯的二進制檔的目錄(C:/opencv-4.8.1/newbuild)下找到 install 資料夾
install 資料夾最終輸出的內容如下
我們也成功編譯了 opencv_world 模組。
四. 總結
本文只是便於自己日後翻閱和尋找。
不過整個編譯過程花費了1天多才搞定。編譯的時候遇到各種問題,其實只要仔細閱讀日誌進行分析,總能解決。
當然,自行編譯 OpenCV 庫有很多好處,可以根據自己的需要客製 OpenCV 庫,可以針對特定的硬體平台最佳化 OpenCV 庫等等。
系統化學習直接掃碼檢視
推薦閱讀