ZH ·
🌏 English

Windows 10 环境下使用 CMake 和 VS2019 编译带 CUDA 支持的 OpenCV

使用 C++ 进行计算机图像处理方向的开发,OpenCV 是最常使用的库之一。我个人对 OpenCV 的使用大概从 2.4 版本开始,一直持续到目前的 4.5.2 版本。

OpenCV 功能非常丰富,包含了传统图像处理的绝大部分经典算法,其基础矩阵类型 Mat 简单而强大。目前的版本还加入了 DNN 模块以支持深度学习模型推理。最近我决定使用 DNN 模块进行算法部署,由于需要用到 GPU 加速,而官方提供的标准预编译安装包并不支持 CUDA,于是决定动手从源码编译,定制符合需求的 OpenCV 库。对于日常开发工作来说,这算是一件一劳永逸的事情。

由于业务需求,本文的实践在 Windows 10 操作系统下进行。虽然在 Linux 下进行此类编译更为便捷且问题较少,但好在 Windows 平台下的 Visual Studio 对 CMake 的支持也越来越完善了。

准备工作

按照习惯,我在自己的工作目录下建立了一个名为 opencv-github 的文件夹,随后从 GitHub 克隆最新的 opencvopencv-contrib 源码。opencv-contrib 通常包含非稳定版组件以及受专利保护的 nonfree 组件。

git clone https://github.com/opencv/opencv.git

image

git clone https://github.com/opencv/opencv_contrib.git

image

CMake 配置

如果安装了 Visual Studio 2019,通常可以直接从 CMD 控制台启动 cmake-gui。打开后,配置源码路径和编译输出路径。我的配置如下:

image

点击 Configure,选择 Visual Studio 16 2019x64 平台进行编译。

image

image

第一次 Configure 时,ippicv 依赖包可能会下载失败,重新 Configure 一次通常即可成功。

image

定制编译选项

  1. 添加 Contrib 模块:搜索 OPENCV_EXTRA_MODULES_PATH 选项,填入 opencv_contrib 的 modules 路径。

    D:/WORK/opencv-github/opencv_contrib/modules

    image

  2. 开启 CUDA 支持:搜索 cuda,勾选 OPENCV_DNN_CUDAWITH_CUDA。注意不要勾选 BUILD_CUDA_STUBS注意:CUDA 和 cuDNN 需要提前安装好,并确保版本对应。 再次点击 Configureimage

  3. 合并库文件:选中 BUILD_opencv_world 选项。这会将所有组件编译进一个单一的 DLL/Lib 文件中。虽然这会增加单个库的体积,但使用起来非常方便,不必手动链接每一个细分组件。 image

  4. 开启 Non-free 算法:选中 OPENCV_ENABLE_NONFREE。开启此选项会将一些受专利保护(不能免费商用)的算法编译进去,适合科研和实验。之前最著名的 nonfree 算法是 SIFT,不过现在 SIFT 的专利已过期并集成到了主库中。 image

生成与编译

点击 Generate

image

生成结束后,点击 Open Project 启动 Visual Studio 2019。

image

在解决方案资源管理器中,展开 CMakeTargets,找到 ALL_BUILD

image

image

右键选择 生成 (Build) 或直接按 F7 开始编译。待 ALL_BUILD 结束后,再找到 INSTALL 项目并执行生成。

编译完成后,所有的头文件、.lib 文件、.dll 文件以及 CMake 配置文件都会生成在 build/install 目录下。这里的 ALL_BUILDINSTALL 流程,对应 Linux 下常见的 makemake install

至此,你已经拥有了定制化的 OpenCV 库,可以开始愉快的开发了!