序言

经典图像处理库:OpenCV。在 Windows 上使用部署比较简单,可以分为使用源代码、使用动态库(.dll)、使用静态库(.lib)的方式,可是这些都是官方编译好的。而在 Linux 系统上使用,由于 Linux 有各种各样的发行版本,导致不能直接使用官方编译好的版本(常用版本),这个时候,就需要自己通过编译 OpenCV 源码的方式安装 OpenCV 了。

源码安装的方式会根据当前系统中安装的组件来编译,所以这编译出来的 OpenCV 库是对应这个系统独一无二的,因此将这个在这台机器上编译出来的 “独一无二” 的 OpenCV 移到别的系统上使用就不一定可行了。

接下来就说明如何源码安装 OpenCV。(这里用 Ubuntu 系统作为实例)

安装

1、一般来说,应该先更新apt(可跳过)

2、安装依赖库

如果不用其他第三方的依赖库,也可以正常编译出 OpenCV 库,但会因为缺少一些依赖,导致使用的时候出现一些找不到该函数之类的错误。因此酌情挑选安装依赖库。

这时候要确认好以上依赖都要安装好,不然如果某些依赖没有安装正确,编译得到的 OpenCV 会缺失一部分基本功能(在编译过程中会有提示但是不会因此停止编译,所以很难察觉!)。例如,利用 cv2.imread() 读图片的时候会读到 None。

3、python依赖(可选择)

一般现在的 Linux 系统都会或多或少的自带支持 python,因此都会有已装一些关于 python 的依赖,如:python-dev、python3-dev 等。

安装完上面的依赖后,开始部署 python 依赖,python 和 python3 两个版本都要安装,OpenCV 会据此自动生成两个版本的 python 依赖。(如果只想用 C/C++ 版不想用 python 版可以不安装,OpenCV 安装的时候回自动忽略。但强烈推荐安装!)

一般如果个人安装的话,会结合虚拟环境(如Anaconda)来安装 python 库,这样比较容易区分个人工程环境&系统全局环境。

4、下载 OpenCV 和 OpenCV_contrib

如果在上面安装依赖的步骤中,安装了 Git 依赖,而且网速不错,可以直接从 GitHub 上将 OpenCV 拉下来。

5、编译安装 OpenCV

安装过程要了解各个重点。进入 OpenCV 目录,这里就是上面的 opencv 目录中,创建一个 build 文件夹目录。

然后,利用 cmake 生成 makefile,并且设置选择项(安装的路径),具体请参考 cmakelist 中的参数帮助信息描述,这里只列出重要的几项:

如果没有对 CMakeLists 进行修改,那么 OpenCV 会默认的安装到如下地址:

有时候安装高版本的 OpenCV 却想保留系统原有的旧版本 OpenCV,就需要修改这里的安装路径,保留原有旧版本的 OpenCV。

cmake 设置完毕后,就可以进行 make 操作,这里可以直接用 nproc 查到 CPU 核心可以支持的最大线程数,然后酌情调用一半的资源对 OpenCV 进行 make 操作,提高编译速度。

6、创建 python 接口 link

如果要使 python 接口对上 OpenCV,需要先查看到编译好的 OpenCV 生成的 .so 文件在哪里:

找到的位置因为自己的 python 安装地址的不同,生成的地址会有所不同:

如果是个人的虚拟环境,则:

7、开发环境配置

如果要利用 OpenCV 开发库时,其他使用这个库的程序编译时所需的库信息,在 Linux 上是通过 pkg-config 获取的(如version、include、lib等),如下:

这是因为关于库的信息是由 pkg-config 管理,方便获取,一般其管理的文件目录在 /usr/lib/pkgconfig 或者 /usr/local/lib/pkgconfig。系统默认是用的 /usr/lib/pkgconfig 上,但用户自己编译安装的库基本都安装在 /usr/local/ 目录下,所以才会有 “我安装了这个库,怎么 pkg-config 没有信息!” 这种错误。

当 pkg-config 没有检测到 xxx 库的信息时候,可以考虑的原因有以下几种:

  • 因为 /usr/lib/pkgconfig 和 /usr/local/lib/pkgconfig 的缘故,pkg-config 检测的是默认的 /usr/lib/pkgconfig,其中并没有 xxx 库的信息文档

解决办法:将 /usr/lib/pkgconfig 加入到环境里,修改参数 PKG_CONFIG_PATH ,具体操作如下:

  • 因为 xxx 库安装不完全,在 pkgconfig 目录内没有生成该库对应的信息文档 xxx.pc 文件

解决办法:以 CMake 为例,在上面编译中设置参数 OPENCV_GENERATE_PKGCONFIG=ON。然后在生成的目录下 /lib/ 中会生成一个 pkgconfig 目录里头有记录该库信息的 xxx.pc 文件。

  • 因为指定了 xxx 库的安装位置,里头有 xxx.pc 文件了,但并没有将文件移到 pkgconfig 目录中,或者没有将该 xxx.pc 文件所在目录加入到 PKG_CONFIG_PATH 变量里

解决办法:将 xxx.pc 文件 copy 到 /usr/lib/pkgconfig 或者 /usr/local/lib/pkgconfig 中,又或者将该文件所在目录添加到 ~/.bashrc 文件的 PKG_CONFIG_PATH 变量里。

后续检测

—测试是否安装正确

下载RedEyeRemover.zip,解压后利用下面的命令编译一下看是否能运行:

检测 python,在安装 OpenCV 的 python 环境下:

—卸载源码安装的 OpenCV(重要)

如果要卸载源码安装的 OpenCV,需要在之前 build 文件夹中执行 sudo make uninstall

因为源码安装后的 OpenCV 相关文件信息都在 build 的 CMakeFile 中有记录,所以可以直接快速卸载。

要是没有卸载干净,可以手动人为的进行卸载,如(以默认安装路径为例):

参考资料

https://www.learnopencv.com/install-opencv3-on-ubuntu/