如何在Ubuntu 16.04上安装支持Python 3.x的OpenCV

0.343字数 6244阅读 9525

申明: 本文翻译自PyImageSearch社区2016年的一篇关于OpenCV的安装教程“Ubuntu 16.04: How to install OpenCV”,可能存在翻译错误,只为自己备忘备查,读者请自行核对。以下内容译自原文。


cover_image

在过去运营PyImageSearch的两年里,我写了两个关于在Ubuntu上安装OpenCV的教程,详细记录了安装过程中的步骤。你可以点击下方连接找到对应的原文:

然而,随着Ubuntu 14.04被放弃支持,Ubuntu 16.04作为下一个长期支持版(截至2021年4月),我认为有必要转移到新的版本上来,更新一个Ubuntu+OpenCV的安装教程

在这个教程中,我将会记录、演示和提供在Ubuntu 16.04上安装opencv 3并绑定Python 2.7或Python 3.5的详细步骤。

此外,该文档已从我以前的Ubuntu 14.04教程中全面更新,如果需要,请从apt-get库中获取最新的更新包。

想了解如何在你的 Ubuntu 16.04 上安装OpenCV,继续往下看。

注意: 不关心Python绑定,只想在你的系统上安装OpenCV(可能就为了写C++)?不用担心,本教程仍然对你有用。按照我文中的说明,一步步来,在本文的最后,你将在系统上安装opencv。在那时,你只需忽略Python绑定就可以了。

如何在Ubuntu 16.04上安装支持Python 3.x的OpenCV

The actual versions (as of 24 October 2016) are:在阅读本教程之前,我想提醒你一下, Ubuntu 16.04 实际上是安装了Python 2.7和Python 3.5安装的。

  • Python 2.7.12 (当你在终端输入python时,默认启动这个).
  • Python 3.5.2 (能够通过python3 命令启动).

再次说明,很有必要强调一下,Python 2.7 仍然是Ubuntu 默认的版本。 也 有打算整合到 Python 3 并且使用 Python 3 作为默认;然而, 目前我只能说, 我们可能还需要等很久。

无论哪种情况,本教程都支持Python 2.7和Python 3。我已经高亮显示了那些需要你对Python版本做选择的步骤。确保你的选择是始终一致的,否则很可能会遇到编译、链接和导入错误。

关于你应该使用哪一个Python版本……我不会卷入那个争论。我会简单地说,应该使用你喜欢的任何版本的Python,并且每天使用。请记住Python 3是未来的,但也要记住,一旦理解Python版本之间的差异,将Python 2.7代码移植到Python 3就不具有挑战性了。至于opencv,opencv 3不关心您使用的Python版本:绑定将工作相同。

说了这么多,现在让我们开始在Ubuntu 16.04上安装opencv并绑定python吧。

步骤#1: 在 Ubuntu 16.04 上安装 OpenCV 的依赖库

本教程中的大部分(实际上是所有的)步骤都是通过使用终端完成的。首先,打开命令行,并更新apt-get包管理器,刷新、升级和预先安装的包/库:
Ubuntu 16.04 如何安装OpenCV:

$ sudo apt-get update
$ sudo apt-get upgrade

接下来,我们来安装一些开发工具:

$ sudo apt-get install build-essential cmake pkg-config

pkg-config包(很可能)已经安装在你的系统上,但一定要包括在上面的apt-get命令中,以防万一。cmake程序用于自动配置OpenCV构建。

opencv是一个图像处理和计算机视觉库。因此,opencv需要能够从诸如JPEG、PNG、TIFF等磁盘加载各种图像文件格式,以便从磁盘加载这些图像,而opencv实际上调用其他图像I/O库,这些库实际上有助于加载和解码过程,下面我们需要安装必要的库:

$ sudo apt-get install libjpeg8-dev libtiff5-dev libjasper-dev libpng12-dev

【译者注】libjpeg8-dev、libtiff5-dev、libpng12-dev可能存在新的版本,分别使用apt-get install安装libjpeg-dev、libtiff-dev、libpng-dev即可

好了,现在我们有了从磁盘加载图像的库,但是视频呢?使用以下命令安装用于处理视频流和从摄像机访问帧的包:

$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
$ sudo apt-get install libxvidcore-dev libx264-dev

opencv提供了一组开箱即用的,也非常有限的GUI工具。这些GUI工具允许我们将图像显示到屏幕上。( cv2.imshow ), 等待/记录按键 ( cv2.waitKey ), 跟踪鼠标事件 ( cv2.setMouseCallback ), a以及创建一个简单的GUI元素,如滑块和trackbars。 再次提醒,您不要期望能用opencv构建完整的GUI应用程序——这些只是简单的工具,允许你用来调试代码并构建非常简单的应用程序。

在内部,处理OpenCV的GUI操作的模块名字叫做highgui,highgui模块依赖于GTK库,该库可以通过下面的命令安装:

$ sudo apt-get install libgtk-3-dev

接下来,我们安装用于优化opencv内部各种功能的库,如矩阵运算:

$ sudo apt-get install libatlas-base-dev gfortran

在为Python 2.7和Python 3.5安装了Python开发的头文件和库文件(两个版本都需要)之后,我们将完成步骤1:

$ sudo apt-get install python2.7-dev python3.5-dev

注意如果你没有安装Python开发头文件和静态库,在我们的步骤4运行cmake配置build的时候,你将会碰到问题。如果这些文件没有安装,然后指定命令将无法自动确定正确的Python解释器和Python库。简而言之,这个部分的输出将看起来是“空的”,您将无法构建Python绑定。当你进行到步骤4,留意一下你的命令行输出与我的差异。

步骤 #2: 下载 OpenCV 源码

在这篇文章的发表时间,OpenCV的最新版本是3.1.0,我们下载一个zip文件,并使用下面的命令进行解压:

$ cd ~
$ wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.1.0.zip
$ unzip opencv.zip

当OpenCV有新版本发布时,您可以查看OpenCV 官方 GitHub页面,通过改变命令中.zip文件的版本号,下载最新的版本。

然而,我们不仅仅下载的OpenCV的源码就完事了,我们还需要opencv_contrib库:

$ wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.1.0.zip
$ unzip opencv_contrib.zip

为什么我们要去下载contrib库?

嗯,我们希望完整地安装opencv 3,以获得完整的功能特性(没有双关语的意思),例如,SIFT和SURF。在opencv 2.4中,在opencv的默认安装中包含了SIFT和SURF。然而,随着opencv 3 +的发布,这些包已经搬到了contrib,这中变化,要么因为(1)模块目前正在开发,要么因为(2)模块被标记为“非免费”(即专利)。在这个博客文章中,你可以了解更多关于SIFT/SURF重构的理由。

注意您可能需要在复制粘贴过程中使用“<=>”按钮展开上面的命令。3.1.0.zip.zip后缀可能在小一点的浏览器窗口被截断。为方便起见,我把opencv以及opencv_contrib的源码压缩包的完整URL放在下面:
【译者注】“<=>”按钮是指代码块,作者提示上述命令比较长,不要遗漏没有完全展示出来的部分

我还想提醒你,OpenCV和opencv_contrib版本应该要保持相同(在这个例子中是3.1.0)。如果版本号不匹配,你很可能在编译时碰到一大堆错误(或者更糟,碰到运行时错误,那是几乎不可能调试的)。

步骤 #3: 安装 Python 环境—— Python 2.7 或 Python 3

现在我们可以开始为build配置我们的Python开发环境了。第一步是安装Python包管理器PIP:

$ cd ~
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py

我在我写过的每一个opencv+Python安装教程中都提及到,但我还会在这里再次说:我既是virtualenv的粉丝,也是virtualenvwrapper的追崇者。这些Python包允许您为正在处理的每个项目创建独立的独立Python环境。

简而言之,使用这些包可以解决“项目X依赖于版本1.x,但项目Y又需要4.x”的两难问题。使用Python虚拟环境的一个奇妙的小作用是,可以使系统Python保持整洁、整洁、无杂乱。

虽然你完全可以将opencv与Python进行绑定安装,而不使用Python的虚拟环境,但是我强烈推荐你使用它们,因为PyImageSearch上的其他教程也是支持Python虚拟环境的。我也会默认在其他教程中,你把virtualenvvirtualenvwrapper都安装了。

如果你想要一个全面地关于为什么Python虚拟环境是最佳实践的详细解释,你绝对应该读一下这篇发表在RealPython上的优秀博客。我还提供了一些注释,说明为什么我个人在另一个教程的上半部分更喜欢Python虚拟环境。

再一次,让我重申,Python社区的标准实践是利用某种虚拟环境,所以我建议您也这样做:

$ sudo pip install virtualenv virtualenvwrapper
$ sudo rm -rf ~/get-pip.py ~/.cache/pip

我们安装了virtualenvwrappervirtualenv之后,需要更新~ /.bashrc文件,将下面的几行内容加到文件最后:

# virtualenv and virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

~ / .bashrc文件仅仅是一个bash shell脚本,当你打开一个新的终端时,它会自动运行。您通常使用此文件来设置各种配置。在本文此处,我们设置一个环境变量称为WORKON_HOME指向我们Python虚拟环境活动的目录。然后我们从virtualenvwrapper加载任何必要的配置。

更新你的~ / .bashrc文件只需使用标准文本编辑器。我建议使用nanoVimEmacs。您也可以使用图形编辑器,但如果您刚刚开始使用Linux,nano可能是最容易操作。
一个更简单的解决方案是使用cat命令并完全避免编辑器:

$ echo -e "\n# virtualenv and virtualenvwrapper" >> ~/.bashrc
$ echo "export WORKON_HOME=$HOME/.virtualenvs" >> ~/.bashrc
$ echo "source /usr/local/bin/virtualenvwrapper.sh" >> ~/.bashrc

在修改了~ /.bashrc文件之后,我们需要重新加载这些变化的内容:

$ source ~/.bashrc

注意.bashrc调用source操作只需进行一次,对当前的shell会话都生效。只要我们打开一个新的终端,.bashrc的内容将自动执行(包括我们的更新)。

现在我们已经安装virtualenvvirtualenvwrapper,下一步是创建Python虚拟环境,我们使用mkvirtualenv命令进行创建。

但在执行此命令之前,您需要做出选择:你要使用Python 2.7还是Python 3?

您选择的结果将决定您在以下部分中运行的命令。

创建Python虚拟环境

如果你决定使用Python 2.7,请使用以下命令创建 Python 2.7 的虚拟环境:

$ mkvirtualenv cv -p python2

否则使用以下命令创建 Python 3 的虚拟环境:

$ mkvirtualenv cv -p python3

不管您决定使用哪种Python命令,最终的结果是我们创建了一个名为CV的Python虚拟环境(简称“计算机视觉”)。

您可以将这个虚拟环境命名为您喜欢的任何名称(并创建您想要的Python虚拟环境),但对于Bing,我建议您使用CV名称,因为这是我在本教程其余部分中将使用的名称。

验证你是否在“cv”虚拟环境中

如果你没有重启你的Ubuntu系统;(那么)注销并重新登录;或者打开一个新的终端,你需要使用workon命令重新访问您的cv虚拟环境。一个workon例子如下:

$ workon cv

为了验证你是否在CV虚拟环境中,只需检查你的命令行——如果你看到了提示符前面的文本(cv),那么你就在CV虚拟环境中了:

处于cv虚拟环境下

否则,如果你不看到的cv的字样,那么你是不是在虚拟环境:
没有处于cv虚拟环境下

要想访问cv虚拟环境,只需简单地使用上述的workon指令。

在Python虚拟环境中安装NumPy

在我们编译OpenCV之前,最后需要做的就是安装NumPy,NumPy是用于数值处理Python包。NumPy的安装,需要确保你在cv的虚拟环境(否则NumPy将被安装到系统的Python版本,而不是cv环境),在cv环境下,执行以下命令:

$ pip install numpy

步骤 #4:在Ubuntu 16.04 上配置和编译OpenCV

此时,所有必须的依赖环境都已经安装好了——我们现在已经准备好编译和OpenCV了!

但在开始之前,仔细检查你的cv虚拟环境,审视你的提示(你应该在命令行首看到(cv)字样),如果没有,用workon命令:

$ workon cv

确保你在cv虚拟环境后,我们可以使用cmake设置和配置我们的build:

$ cd ~/opencv-3.1.0/
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D INSTALL_C_EXAMPLES=OFF \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.1.0/modules \
    -D PYTHON_EXECUTABLE=~/.virtualenvs/cv/bin/python \
    -D BUILD_EXAMPLES=ON ..

上述命令将工作目录切换到~ / opencv-3.1.0,如果你一直关注这个教程,你就会发现,这就是你下载的.zip文件解压后的路径。

注意: 如果你按照本教程的指导,使用cmake或者make命令时,得到一个类似于这样的错误:stdlib.h: No such file or directory,你还需要将以下选项包含在cmake中:-D ENABLE_PRECOMPILED_HEADERS=OFF。在这种情况下,我建议你删除build目录,重新创建它,然后将上述选项包含进来,重新运行cmake。这将解决stdlib.h错误。感谢Carter Cherry和Marcin在评论部分指出!

在这个目录中,我们创建一个名为build的子目录,并切换到该目录下。build目录是实际编译进行的地方。

最后,我们执行cmake配置我们的build。

在我们开始到OpenCV的实际编译之前,请检查你的cmake的输出!

为此,向下滚动到标题为Python 2和Python 3的部分。
如果你正在Ubuntu 16.04上编译支持Python 2.7的OpenCV ,确保Python 2部分包括有效路径的InterpreterLibraries,numpy以及packages path。你的输出应该和下图类似:

cmake输出内容示例1

检查这个输出,你可以看到:

  1. Interpreter 指向CV虚拟环境中的Python 2.7二进制。
  2. Libraries 指向Python 2.7的库(我们在步骤1的最后安装的)。
  3. numpy 指向在cv的虚拟环境安装的NumPy
  4. 最后,packages path指向lib/python2.7/site-packages。结合CMAKE_INSTALL_PREFIX,这意味着,经过编译OpenCV,我们会发现我们的cv2.so绑定在/usr/local/lib/python2.7/site-packages/

类似地,如果您正在编译支持Python 3的OpenCV,那么你想看到的Python 3部分应该与下面的类似:

cmake输出内容示例2

再次,注意我的Interpreter,Libraries,numpy以及packages path都被正确设置。

如果你不在这些变量的路径看cv的虚拟环境,那么几乎可以肯定,是因为你没有在cv虚拟环境中运行cmake!

如果事实确实如此,只需通过workon cv访问cv虚拟环境,并重新运行以上提到的cmake命令。

假设你的命令退出没有任何错误,你现在可以编译OpenCV了:

$ make -j4

-j参数是一个开关,控制编译OpenCV时要使用的进程数,你可以将此值设置为机器上的处理器(内核)的数量。以我为例,我有一个四核处理器,所以我设置为j4。

使用多个进程会使得OpenCV 编译更快;但是,有时会遇到竞争条件和编译炸弹。然而,如果在此之前,没有过大量的编译OpenCV的经验,你是不能确定是不是这个原因导致的。这种的情况下,如果遇到错误,我首先建议运行make来刷新build,然后只使用单个内核编译:

$ make clean
$ make

下面你可以找到一个在Ubuntu 16.04上编译成功的opencv的截图:
[图片上传失败...(image-2a7afe-1515153536253)]
最后一步就是真正在Ubuntu 16.04上安装opencv 3了:

$ sudo make install
$ sudo ldconfig

步骤 #5: 完成 OpenCV 的安装

我们即将完成整个步骤,只需再多走几步,你的Ubuntu 16.04系统将完整安装OpenCV 3。

对Python 2.7而言:

在运行sudo make install命令之后,绑定Python 2.7的OpenCV 3 此时应该位于/usr/local/lib/python-2.7/site-packages/路径下。你可以使用ls命令进行验证:

$ ls -l /usr/local/lib/python2.7/site-packages/
total 1972
-rw-r--r-- 1 root staff 2016608 Sep 15 09:11 cv2.so

注意:*由于某些原因,你可能会发现OpenCV安装在/usr/local/lib/python2.7/dist-packages而不是/usr/local/lib/python2.7/site-packages(注意dist-packagessite-packages的区别)。如果你的cv2.so绑定不在site-packages目录,那么去dist-pakages检查看看

最后一步是建立sym-link,将OpenCV cv2.so绑定到Python 2.7的cv虚拟环境:

$ cd ~/.virtualenvs/cv/lib/python2.7/site-packages/
$ ln -s /usr/local/lib/python2.7/site-packages/cv2.so cv2.so

对Python 3.5而言:

在运行sudo make install命令之后,OpenCV + Python 3的绑定此时应该位于/usr/local/lib/python-3.5/site-packages/路径下。重复一下,你可以使用ls命令进行验证:

$ ls -l /usr/local/lib/python3.5/site-packages/
total 1972
-rw-r--r-- 1 root staff 2016816 Sep 13 17:24 cv2.cpython-35m-x86_64-linux-gnu.so

自从OpenCV 3发布以来,我就一直困惑这个行为,但由于某些原因,编写支持Python 3的OpenCV时,输出cv2.so文件名是不同的。你得到的文件名可能会不同,但它看起来应该类似于cv2.cpython-35m-x86_64-linux-gnu.so

再一次,我不知道为什么会发生这种情况,但这是一个很容易解决的问题。我们需要做的就是重命名文件:

$ cd /usr/local/lib/python3.5/site-packages/
$ sudo mv cv2.cpython-35m-x86_64-linux-gnu.so cv2.so

在将cv2.cpython-35m-x86_64-linux-gnu.so重命名为简单的cv2.so之后,我们可以建立sym-link,将OpenCV cv2.so绑定到Python 3.5的cv虚拟环境:

$ cd ~/.virtualenvs/cv/lib/python3.5/site-packages/
$ ln -s /usr/local/lib/python3.5/site-packages/cv2.so cv2.so

步骤 #6: 测试你的OpenCV是否安装成功

恭喜你,现在已经在Ubuntu 16.04系统中安装了OpenCV 3!
验证安装是否正常:

  1. 打开一个新的终端。
  2. 执行workon命令,访问Python的cv虚拟环境。
  3. 尝试import python + opencv绑定的cv2。

我已经演示了如何执行下面的这些步骤:

$ cd ~
$ workon cv
$ python
Python 3.5.2 (default, Jul  5 2016, 12:43:10) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.1.0'
>>>

如图所示,我可以将我的opencv绑定导入我的Python 3.5 shell中。

下面是我使用本教程中讲述的相同步骤,并将opencv导入到Python 2.7 shell中的截图:
[图片上传失败...(image-238996-1515153536253)]
因此,不管您决定使用哪一个Python版本,只要跟着本教程中详细介绍的步骤走,你就可以在Ubuntu 16.04系统上安装OpenCV + Python。

一旦OpenCV已安装,你就可以删除opencv-3.1.0opencv_contrib-3.1.0目录(以及与它们相关的.zip文件):

$ cd ~
$ rm -rf opencv-3.1.0 opencv_contrib-3.1.0 opencv.zip opencv_contrib.zip

但是,在运行这个命令时要小心!你需要确保在您的系统中正确地安装了opencv,然后再沿着这些目录进行路由。否则,你将需要重新启动整个编译过程!

故障排除&FAQ

在本节中,我将讨论在Ubuntu 16.04上安装OpenCV 时出现的一些常见questions, problems, 和 issues。

Q:当我执行mkvirtualenvworkon时,得到一个“command not found error”。
A:为什么你会得到这个错误信息,有三个主要的原因,都与步骤#3相关:

  1. 首先,确保你已经安装并使用pip软件包管理器安装了virtualenvvirtualenvwrapper。你可以通过运行验证这个pip freeze,检查输出,并确定能在安装软件包列表中找到virtualenvvirtualenvwrapper

  2. 你的~/.bashrc文件可能没有正确地更新。要排除这个原因,可以使用文本编辑器,如nano,查看你的~/.bashrc文件内容。在文件的尾部,你会看到正确的exportsource命令(再次检查步骤# 3中,需要追加到~ / .bashrc的命令)。

  3. 在编辑你的~/.bashrc文件,你可能已经忘记了source操作来重新加载。请记住,在编辑了~/.bashrc之后,一定要执行source~/.bashrc,重新加载使之生效——你才能够使用mkvirtualenvworkon指令。

Q:每当我打开一个新的终端,或者注销、重新启动我的Ubuntu系统,我都无法执行mkvirtualenvworkon指令。
A:请查看前一个问题的原因2

Q:当我(1) 打开一个Python shell终端imports OpenCV的库,或者 (2) 执行一个Python 调用OpenCV的脚本,都会得到一个这样的error: Import Error: No module named cv2 .
A:不幸的是,这个错误信息的确切原因是非常难以诊断的,因为有多种原因可能导致。一般来说,我建议你按照以下说明去诊断和解决错误:

  1. 确保你在cv虚拟环境下,利用workon cv命令。如果运行这个命令得到错误,那么请参见“FAQ”中的第一个问题。
  2. 如果你已经确定你的~/.bashrc文件已经被正确地更新,并且执行了source操作,那么尝试在cv虚拟环境中查看site-packages目录的内容。site-packages目录在~/.virtualenvs/cv/lib/python2.7/site-packages/或者~/.virtualenvs/cv/lib/python3.5/site-packages/中,这取决于你的Python 版本。
  3. 请确定以下两点:(1) site-packages目录下有一个cv2.so文件;(2) 它被正确地sym-linked到一个有效的、存在的文件。
    务必检查site-packages(甚至dist-packages)目录,因为系统安装的Python分别位于/usr/local/lib/python2.7/site-packages/或者 /usr/local/lib/python3.5/site-packages/。理想情况下,应该有一个cv2.so文件。
  4. 如果以上的条件都不满足,那么请检查你的OpenCV的build/lib目录。那里应该有一个cv2.so文件(前提是cmake和make命令执行之后,都没有出错)。如果cv2.so文件存在,那么手动复制他到系统的site-packages目录和cv虚拟环境的site-packages目录。

那么下一步是什么?

恭喜!现在你已经在Ubuntu 16.04系统上安装了全新的OpenCV ,而且我确信你只是想利用你的安装来构建一些了不起的的计算机视觉应用程序…

……但我敢打赌,你刚开始学习计算机视觉和OpenCV,可能对开始的地方感到有些困惑和不知所措。

就我个人而言,我是热衷于通过示例学习的,所以,读一读这个关于检测图片和视频中的猫的博客,将会是很有意思的第一步。这个教程是手把手地演示如何快速构建一个Python + OpenCV应用程序来检测图像中的猫。

如果你真的想提高你的计算机视觉技能,你一定要看看我的书,《实用的Python和OpenCV案例研究》。我的书不仅涵盖了计算机视觉和图像处理的基础知识,还教你如何解决现实世界的计算机视觉问题,包括图像和视频流中的人脸检测、视频中的对象跟踪手写识别
[图片上传失败...(image-2cc825-1515153536253)]

因此,让我们把刚才安装在Ubuntu 16.04系统上的OpenCV 3好好利用起来——点击这里了解更多实际的项目,这些问题都可以通过学习《实用的Python和OpenCV案例研究》来解决

总结

在今天的博客文章中,我演示了如何用Ubuntu 16.04系统中的Python 2.7或Python 3绑定安装OpenCV 3

更多关于OpenCV在其他操作系统上的安装教程(如OSX,Raspbian等),请参阅本网页,我提供额外的资源链接。

推荐阅读更多精彩内容