一. 背景
目前維護(hù)的某個(gè)項(xiàng)目是在 Windows 下運(yùn)行的,并且使用了 OpenCV 4.5.2 版本。
我本地的開發(fā)環(huán)境是 Mac 并使用了比較新的 OpenCV 4.8.1 版本。為了和本地開發(fā)環(huán)境保持一致,我打算對(duì)項(xiàng)目中使用的 OpenCV 進(jìn)行升級(jí),因?yàn)樵擁?xiàng)目還是用了擴(kuò)展模塊的一些功能,所以需要自行編譯。
本文只是記錄自己在編譯時(shí)踩過的坑,避免下次再犯或者給有需要的人。
二. 需要準(zhǔn)備的軟件
CMake 3.13 或者以上版本
https://cmake.org/

Visual Studio 2022 社區(qū)版本
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 擴(kuò)展模塊源碼包
https://github.com/opencv/opencv_contrib/releases/tag/4.8.1

三. 編譯
3.1 使用 CMake
3.1.1 準(zhǔn)備工作
解壓 OpenCV4.8.1 源碼包和擴(kuò)展模塊源碼包到某個(gè)位置

打開 cmake-gui,設(shè)置 OpenCV4.8.1 源碼的位置和輸出編譯的二進(jìn)制文件的位置

3.1.2 Configure
點(diǎn)擊"Configure",彈窗會(huì)顯示build目錄沒有創(chuàng)建,是否需要?jiǎng)?chuàng)建。

點(diǎn)擊“Yes"之后,CMake 會(huì)讓你選擇使用什么工具來生成這個(gè)項(xiàng)目。我們采用 Visual Studio 2022。

"Configure"配置成功后,會(huì)出現(xiàn)這個(gè)界面

此時(shí),我們可以設(shè)置擴(kuò)展模塊的路徑

擴(kuò)展模塊的路徑在設(shè)置時(shí),一定要到 modules 這個(gè)文件夾,否則后面再次"Configure"會(huì)失敗。
如果需要編譯 OpenCV World 模塊,也需要在這里單獨(dú)設(shè)置。

World 模塊是一個(gè)超級(jí)模塊(super-module),它結(jié)合了用戶選擇的所有其它模塊。它是一個(gè)一體化(all-in-one)模塊,具有所有庫(kù)的功能。
然后再次點(diǎn)擊"Configure"。

此時(shí),最好看一下 CMake 的下載日志,下面的文件是 CMake 的下載日志。

某些文件的無法下載可能會(huì)最終導(dǎo)致 OpenCV World 模塊無法編譯成功。
我主要是修改這幾個(gè)地方:
a. 進(jìn)入 C:/opencv-4.8.1/opencv-4.8.1/3rdparty/ippicv 目錄
將 ippicv.cmake 的 https://raw.githubusercontent.com 修改為:https://raw.staticdn.net
b. 進(jìn)入 C:/opencv-4.8.1/opencv-4.8.1/3rdparty/fmpeg 目錄
將 ffmpeg.cmake 的 https://raw.githubusercontent.com 修改為:https://raw.staticdn.net
c. 進(jìn)入 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. 進(jìn)入 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. 進(jìn)入 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
接下來,點(diǎn)擊"Generate"生成使用 CMake 構(gòu)建的項(xiàng)目

3.1.4 Open Project
最后點(diǎn)擊"Open Project",喚起 Visual Studio 2022 打開該項(xiàng)目。
當(dāng)然也可以去輸出編譯的二進(jìn)制文件的目錄(C:/opencv-4.8.1/newbuild) ,打開 OpenCV.sln 文件達(dá)到同樣的效果。

3.2 使用 Visual Studio 2022
在編譯之前,先配置 opencv_world 模塊,然后選擇 release 或者 debug。

找到 CMakeTargets,選擇 ALL_BUILD 進(jìn)行生成。

上述步驟生成成功后,選擇 INSTALL 進(jìn)行生成。

INSTALL 生成成功后,這次編譯算是大功告成了。我們完成了OpenCV4.8.1 及其擴(kuò)展模塊的編譯。

我們可以在輸出編譯的二進(jìn)制文件的目錄(C:/opencv-4.8.1/newbuild)下找到 install 文件夾

install 文件夾最終輸出的內(nèi)容如下

我們也成功編譯了 opencv_world 模塊。

四. 總結(jié)
本文只是便于自己日后翻閱和查找。
不過整個(gè)編譯過程花費(fèi)了1天多才搞定。編譯的時(shí)候遇到各種問題,其實(shí)只要仔細(xì)閱讀日志進(jìn)行分析,總能解決。
當(dāng)然,自行編譯 OpenCV 庫(kù)有很多好處,可以根據(jù)自己的需要定制 OpenCV 庫(kù),可以針對(duì)特定的硬件平臺(tái)優(yōu)化 OpenCV 庫(kù)等等。