在计算机领域学习,多多少少都会遇到跟图像相关的领域,比如计算机视觉、图形学、图像处理。跟图像打交道的话,一般都会用到第三方库,而 opencv 就是一个非常常见的图像库。

使用 opencv 需要先安装,对于 python 来说,安装只是一句命令行的事;而对于 c++ 来说,安装第三方库就没这么简单了,往往都会经历一些磕磕碰碰,那么这次就来介绍一下如何安装和使用 opencv。

推荐阅读 【五仁C++】静态库?动态库?.a.so.lib.dll的生成与使用(g++版)

为什么要源码编译

opencv 是提供了 windows 二进制安装包的,也就是那种,用鼠标点几下就能成功安装,但是这种方式安装的 opencv 只能在 VS 里面使用,不能用通常的方式在其他的编译器中使用(微软不愧是你)。

用过 VS-code 的应该知道,VS-code 本质上就是使用命令行来编译,通过调整 g++ 的参数来链接第三方库,想要以这种方式来使用 opencv,就必须进行源码编译。当然,源码编译出来的 opencv 在 VS 也能用。所以说,如果只想在 VS 里面使用 opencv 的话,就不需要看这篇文章后面的内容了,直接去官网下载个二进制安装包,鼠标点两下就安装完了。

前置条件

已安装 cmake 和 mingw

先下载

这是 opencv 的官网:https://opencv.org,从官网可以去到文档、论坛等地方,也可以去到 github。

我们可以直接去 https://github.com/opencv/opencv/releases 找 opencv 的多个发行版本,在这些版本里面,以3开头的版本和以4开头的版本有较大的差别,它们的函数接口的规范可能都不一样,如果你的朋友使用 opencv 的 3.4.15 版本,而你下载了 4.5.5 版本,那么你朋友的代码在你的电脑上很可能无法运行,而如果你下载了 3.4.16 版本,虽然也可能有版本不兼容的问题,但这种可能性比较小。

以我举例,我习惯了用 3 开头的版本,所以我就找到 3 开头的最晚的版本 3.4.16,然后下载它的源码。如下图,Source code 就是我们需要的源码,其他的不需要下载。提一下,下图那个 opencv-3.4.16-vc14_vc15.exe 就是前面提到过的用鼠标点几下就能安装的二进制安装包,不过只能在 VS 里面使用。

下载完之后,解压到自己喜欢的位置(这个总不用教吧),然后随便新建一个文件夹,作为安装 opencv 的位置。如下图,我新建了一个名为 QwQ 的文件夹,这个文件夹的位置其实没有规定,你喜欢安装在哪里都行,但大伙通常都喜欢把它跟源码放在同一个位置,并且这个文件夹的命名一般为 build,不过这些都是约定俗成的东西。

再重复一遍,我们需要新建一个文件夹来作为安装目录,文件夹的位置和命名都没用硬性要求,只不过一般情况下都跟源码放在一起,且命名为 build,不过我个人更喜欢用 QwQ 命名。

跟着做

下面将演示,如何利用 cmake 和 mingw 从源码编译出 opencv。

运行 cmake 的 bin 目录下的 cmake-gui.exe,将会打开一个面板,我们首先要对 2 个地方进行设置。

“where is the source code” 指的是源码目录,也就是我们从 github 上下载后解压出来的目录;
“where to build the binaries” 指的是安装目录,也就是我们刚刚新建的目录。
修改这两项,分别指向正确的目录(如下图所示)

修改好两个目录之后,点击左下角的 Configure 按钮,此时正在进行的是配置编译器,它会弹出窗口让我们选择等下用于编译的编译器,如下图所示进行选择:

点击 Next 按钮,如果是第一次选择某个编译器,它会弹出窗口让我们设置编译器在哪,选择 MinGW 中的 C 和 C++ 编译的 .exe 程序,他们在 bin 目录下(前提是已经安装好mingw)

选择完编译器后就会开始第一步的配置,这一步主要是配置跟编译器相关的东西,请耐心等待右下角的进度条读完。

上一步是配置编译器,完成之后,第二步将会进行安装选项的配置。opencv 的工程师们制作出了很多东西,但有些东西是我们不需要的,比如工具包里面有剪刀、锤子、钳等很多工具,我们往往只挑选自己需要的几个工具,这样可以节省空间。所以,第二步的配置主要是选择最后安装多少。

每个选项都有默认值,我们唯一要修改的是 BUILD_opencv_world 这个选项,它的默认值是 false,也就是不打勾;我们需要手动将它的值设置为 true,也就是打勾。这个选项的主要作用是将编译后的多个库文件打包成一个,如果不勾选的话,使用 opencv 时常常要手动链接多个库文件,勾选之后就只用链接一个库文件了。勾选之后再次点击左下角的 Configure 按钮。

完成了两步配置之后,就可以点击左下角的 “Generate”,等待显示 “Generate done”,就会生成一些跟编译相关的文件,类似于 Makefile 之类的。

此时我们打开之前新建的安装目录,我的目录是 QwQ。可以看到里面出现了很多叫做 cmake什么什么的文件。此时还没有开始编译 opencv,如果类比于建一栋大楼,我们刚才的操作就是画出设计图,这些 cmake什么什么的文件就是等下用于指导编译的设计图,但还没开始施工,所以像 binlib 这些目录里面全是空的。

下面要做的事就很简单了,只需要打开命令提示符 cmd,输入两句命令行即可。

第一句命令行:按 win+R, 输入 cmd,打开 dos 窗口,切换到刚才新建的 QwQ 文件夹下,输入 minGW32-make 命令,这个时候大概花费 40 分钟左右的时间来编译。mingw32-make.exe 是 mingw 的 bin 目录下的可执行文件,有时根据需要会将其改名为 make.exe,这种情况下也要相应地将编译命令改为 make

minGW32-make

如果你曾看过我最初的一篇博客【五仁C++】静态库?动态库?.a.so.lib.dll的生成与使用(g++版),那么再看上图所显示出的绿色信息,就会知道这是在编译出中间文件 .obj,并生成库。

第二句命令行:在等待编译完成后,输入命令 minGW32-make install,这是最后一步的安装。

minGW32-make install

在安装完成后,我们进入安装目录的 install 目录,对我来说就是 QwQ 里的 install 目录,里面包含了 opencv 的头文件以及库文件。

如果配置过其他跟 c++ 有关环境的小伙伴可能知道,像这种包含 bin 目录的东西,我们在安装完之后都要配置环境变量 PATH,否则程序运行时是找不到动态库的。具体操作就不详细阐述了,去随便搜索“环境变量”就有教程,只需要像下图这样找到 bin 目录然后加入到环境变量 PATH 即可。

使用 opencv

写一个类似于 helloworld 的程序:

#include <opencv2/opencv.hpp>

using namespace cv;

int main(){
    Mat img;
    img = imread("test.jpg");
    imshow("1", img);
    waitKey();
    return 0;
}

VS-code 一般用 g++ 来编译 .cpp 文件,当我们的程序涉及外部库时,会用到它的 -I-L-l 参数。其中 -I 后面跟着头文件的目录,用于让编译器找到头文件,-L 后面跟着库文件的目录,用于告诉编译器哪里有库文件,这两个目录都可以在我们 opencv 的安装目录中找到,-l 后面跟着具体的某一个库,用于指定链接哪一个库,由于我们之前指定生成了 opencv_world 库,它整合了多个库,所以我们此时只需要一个库即可,具体参考下图的编译命令。

需要关注的是,-I 和后面的一个目录,-L 和后面的一个目录,-l 和后面的一个库。这三个参数就足以让我们使用 opencv 了。

结语

c++ 是一个很神奇的东西,什么东西都能搞得很复杂。我有个老师曾说,最难的东西是 helloworld,我以前把它当成一句笑话,现在逐渐发现这是一句真理。即使是计算机专业的学生,也常常会在安装这一步卡住很久,更别说后面的任务了。

看这篇文章的内容会发现,如果没有大家的分享,一个初学者连安装都很难搞明白,这也是我写这些文章的意义。如果当初我入门时可以有多几篇这样的教程,我的学习之路可能不会如此艰辛。

这些跟编译有关的内容,很硬核,很枯燥,但也很值得记录。这些令人心烦的知识,只有反复多次观看,才能理解其精妙之处。这篇文章不仅是写给大家看,也是写给我自己看,温故而知新,希望你也能和我一样喜欢这篇文章。