Windows 下使用 CMake + Visual Studio 2022 编译 OpenCV 4.8.1 及其扩展模块

902 阅读3分钟

一. 背景

目前维护的某个项目是在 Windows 下运行的,并且使用了 OpenCV 4.5.2 版本。

我本地的开发环境是 Mac 并使用了比较新的 OpenCV 4.8.1 版本。为了和本地开发环境保持一致,我打算对项目中使用的 OpenCV 进行升级,因为该项目还是用了扩展模块的一些功能,所以需要自行编译。

本文只是记录自己在编译时踩过的坑,避免下次再犯或者给有需要的人。

二. 需要准备的软件

CMake 3.13 或者以上版本 cmake.org/ cmake.png

Visual Studio 2022 社区版本 visualstudio.microsoft.com/zh-hans/vs/

OpenCV 4.8.1 源码包 github.com/opencv/open… opencv.png

OpenCV 4.8.1 扩展模块源码包 github.com/opencv/open… 扩展模块.png

三. 编译

3.1 使用 CMake

3.1.1 准备工作

解压 OpenCV4.8.1 源码包和扩展模块源码包到某个位置 源码包和扩展模块源码包.jpg

打开 cmake-gui,设置 OpenCV4.8.1 源码的位置和输出编译的二进制文件的位置 源码的位置.jpg

3.1.2 Configure

点击"Configure",弹窗会显示build目录没有创建,是否需要创建。 点击"Configure".jpg

点击“Yes"之后,CMake 会让你选择使用什么工具来生成这个项目。我们采用 Visual Studio 2022。 选择工具.jpg

"Configure"配置成功后,会出现这个界面 配置成功后.jpg

此时,我们可以设置扩展模块的路径 设置扩展模块的路径.jpg

扩展模块的路径在设置时,一定要到 modules 这个文件夹,否则后面再次"Configure"会失败。

如果需要编译 OpenCV World 模块,也需要在这里单独设置。 设置world模块.jpg

World 模块是一个超级模块(super-module),它结合了用户选择的所有其它模块。它是一个一体化(all-in-one)模块,具有所有库的功能。

然后再次点击"Configure"。 再次点击"Configure".jpg

此时,最好看一下 CMake 的下载日志,下面的文件是 CMake 的下载日志。

cmake 的下载日志.jpg

某些文件的无法下载可能会最终导致 OpenCV World 模块无法编译成功。

我主要是修改这几个地方:

a. 进入 C:/opencv-4.8.1/opencv-4.8.1/3rdparty/ippicv 目录, 将 ippicv.cmake 的 raw.githubusercontent.com 修改为:raw.staticdn.net

b. 进入 C:/opencv-4.8.1/opencv-4.8.1/3rdparty/fmpeg 目录, 将 ffmpeg.cmake 的 raw.githubusercontent.com 修改为:raw.staticdn.net

c. 进入 C:/opencv_contrib-4.8.1/opencv_contrib-4.8.1/modules/xfeatures2d/cmake 目录, 将 download_boostdesc.cmake 中的raw.githubusercontent.com 修改为:raw.staticdn.net

d. 进入 C:/opencv_contrib-4.8.1/opencv_contrib-4.8.1/modules/xfeatures2d/cmake 目录, 将 download_vgg.cmake 中的 raw.githubusercontent.com 修改为:raw.staticdn.net

e. 进入 C:/opencv_contrib-4.8.1/opencv_contrib-4.8.1/modules/face 目录, 修改 CMakeLists.txt, 将raw.githubusercontent.com 修改为:raw.staticdn.net

之后再重新"Configure"即可。

3.1.3 Generate

接下来,点击"Generate"生成使用 CMake 构建的项目 点击"Generate".jpg

3.1.4 Open Project

最后点击"Open Project",唤起 Visual Studio 2022 打开该项目。

当然也可以去输出编译的二进制文件的目录(C:/opencv-4.8.1/newbuild) ,打开 OpenCV.sln 文件达到同样的效果。

点击"Open Project".jpg

3.2 使用 Visual Studio 2022

在编译之前,先配置 opencv_world 模块,然后选择 release 或者 debug。 配置opencv_world模块.jpg

找到 CMakeTargets,选择 ALL_BUILD 进行生成。 选择 ALL_BUILD 进行生成.jpg

上述步骤生成成功后,选择 INSTALL 进行生成。 选择 INSTALL 进行生成.jpg

INSTALL 生成成功后,这次编译算是大功告成了。我们完成了OpenCV4.8.1 及其扩展模块的编译。 img_v3_02a2_cc847b70-00d4-49fb-90f1-59b8ac06911g.jpg

我们可以在输出编译的二进制文件的目录(C:/opencv-4.8.1/newbuild)下找到 install 文件夹 img_v3_02a2_55274a44-6d6f-41b2-807c-c1076da6e2dg.jpg

install 文件夹最终输出的内容如下 install 文件夹最终输出的内容.jpg

我们也成功编译了 opencv_world 模块。 成功编译了 opencv_world 模块.jpg

四. 总结

本文只是便于自己日后翻阅和查找。

不过整个编译过程花费了1天多才搞定。编译的时候遇到各种问题,其实只要仔细阅读日志进行分析,总能解决。

当然,自行编译 OpenCV 库有很多好处,可以根据自己的需要定制 OpenCV 库,可以针对特定的硬件平台优化 OpenCV 库等等。