当我开始学习opencv的时候,发现官方只提供了用于vc、android和ios的库文件,而我所用的c++开发环境是VS Code编辑器与mingw-w64编译器,缺少库文件使我很为难,所以最终决定通过源代码自行编译。经过将近三个小时,我成功了。事后总结,我发现编译源代码其实并不难,难在自己初次尝试时保持足够的耐心去解决一些奇奇怪怪的bug。第一次总是很辛苦,所以我写作这篇教程,希望能帮你少走弯路。

编译准备

  本次编译的环境是windows10,需要下载一些辅助资源:首先是opencv源码,此次使用的是目前最新版本4.4.0;然后是mingw-w64编译器;其次需要使用cmake的GUI程序来帮助我们生成编译所需的配置文件。这些资源我都会尽量上传到蓝奏云,可以统一从我在文末给出的资源链接中找到,但如果想要其他版本可以分别去下文中给出的对应地址下载。

opencv4.4.0源码

  源码可以在opencv的github仓库下载,嫌速度慢可以配合我上篇文章提到的github下载加速网站。理论上来说最近的几个版本都可以编译,不过还是建议选最新的版本。下载后将源码解压,并在源代码文件夹外新建一个build文件夹用来存放编译过程中产生的中间文件。

mingw-w64编译器

  mingw-w64mingw是不一样的,详情可以查看各自的官网。我们需要下载posix版本的mingw-w64,因为opencv使用的是符合posix规范的多线程api。在SOURCEFORGE的opencv下载页面,找到如下区域:

第一步

第二步

  下载x86_64-posix-seh后解压即可,并将该解压后目录下的bin文件夹添加到系统环境变量。

cmake程序

  cmake可以去官网下载,找到符合自己设备配置的安装程序下载后安装即可,安装时最好勾选“添加桌面图标”。


编译安装

编译

  打开cmake GUI程序,分别点击“Browse Source…”和“Browse Build…”选择好之前解压的源代码文件夹和新建的build文件夹,如下图所示:

选择源代码

  点击“Configure”,在“Specify the generator for this project”中选择“MinGW Makefiles”,下方的单选框选择“Specify native compilers”,如下图所示:

选择makefile配置

  点击“Next”,选择c和c++编译器,分别是你安装mingw-w64的目录下的bin文件夹中的gcc.exe和g++.exe,如下图所示:

选择编译器

  点击“Finish”,等待一段时间(请保持耐心),直到配置完成,如下图所示:

配置完成

注意

  如果配置失败,并且具有“opencv_ffmpeg.dll下载失败”之类的报错信息,请将资源链接中下载的ffmpeg文件夹中内容复制到源代码目录下.cache/ffmpeg文件夹中,如下图所示:

ffmpeg

  配置成功后,可以看到cmake界面上出现很多配置项。这些配置可以按需修改,前提是你得理解这些配置代表什么含义。我只能模糊地理解其中一部分,在此就不解释了。下面是我所用的配置,追求编译速度尽量快而且功能够用即可。想修改的话请自行查阅其他资料,一个原则是:对不确定的配置项不做改动,沿用默认值即可。

  需要取消勾选的项是:

  1. BUILD_JAVA
  2. BUILD_PERF_TESTS
  3. BUILD_TESTS

  需要勾选的项是:

  1. BUILD_opencv_world
  2. WITH_OPENGL

  配置完后再次点击“Configure”,直到页面由红变白,然后点击“Generate”。

  来到build文件夹下,在此处打开cmd或powershell窗口,执行命令

mingw32-make -j 8

  其中 -j 是控制编译所用线程数的参数,这可以根据电脑性能来决定,电脑不好的话可以改成4线程。等待编译完成,这需要花费一定时间。

注意

  如果编译失败,且报错信息如下图所示,则手动执行命令

cd modules/world
windres vs_version.rc -O coff CMakeFiles\opencv_world.dir\vs_version.rc.obj
mingw32-make -j 8

  结果见下图:

编译报错

安装

  编译完成后,在控制台窗口继续执行

mingw32-make install

  等待安装完成。在这次安装过程中,我发现少安装了几个文件,需要手动复制过去。这些文件如下:

  1. opencv4.4.0/include/opencv2/opencv2.hpp
  2. build/opencv2/cvconfig.h
  3. build/opencv2/opencv_modules.hpp

  将这些文件全部复制到 build/install/include/opencv2 文件夹下即可,install文件夹下就是我们需要的所有文件。值得一提的是,我以前编译opencv4.2.0源码时没有出现过这个问题,我只能猜想是新版本的安装脚本发生了某些变动,也或者是我的配置有误,你要有空,可以试试不改配置直接生成makefile并编译。我会将opencv4.2.0编译后的库文件也上传到蓝奏云中,两个版本随你选择。


测试程序

  为了调试方便,首先将 install 文件夹下的 x64/mingw/bin 文件夹添加到系统环境变量,例如我电脑上的路径为:

H:\Code\c++\opencv\build\install\x64\mingw\bin

  打开VS Code,配置好.vscode文件夹下的三个文件:

  1. c_cpp_properties.json
  2. launch.json
  3. tasks.json

  写一段示例程序并找一张图片用来测试,执行 Ctrl+Shift+B 编译程序,再执行 Ctrl+Shift+T 运行程序,如果没有错误,你将看到图片显示在窗口中。

测试成功


资源链接

  本次资源包含以下文件:

  1. opencv4.4.0 源代码
  2. mingw-w64 编译器
  3. cmake 程序(蓝奏云不支持msi格式,所以进行了压缩,需要解压)
  4. 第三方库 ffmpeg 文件(cmake配置报错时使用)
  5. opencv4.4.0 与 opencv4.2.0 编译完成后的库文件(懒人福音^_^)
  6. vscode用于c++的3个配置文件(需按自己实际情况进行改动)
  7. 测试程序源文件
  8. 一个自主编写的makefile文件,用于opencv学习过程中小项目的编译~

  资源链接在这里,密码是3pi9。


参考资料

  1. Windows10下Opencv4+CMake+MinGW64+VSC安装教程
  2. OpenCV Tutorials : Introduction to OpenCV : Installation in Windows
  3. CMake编译opencv各选项的含义
  4. 提升OpenCV编译速度的方法

后记

  此次编译最大的问题是安装4.4.0库文件时缺少了几个文件,我依稀记得编译4.2.0时好像没出这种幺蛾子,于是用相同的配置把4.2.0也编译了一遍,结果证明不是我的操作与配置问题ヽ(✿゚▽゚)ノ
  写作这篇文章时,我力求清晰与详尽,所以可能显得有点啰嗦,还请见谅!