小马的世界

【跟小马一起学OpenCV-Python】1-OpenCV简介和安装

2021-08-02 · 23 min read
OpenCV Python 计算机视觉

学习如何在你的电脑上设置OpenCV-Python。

OpenCV-Python 教程简介

OpenCV

OpenCV于1999年由Gary Bradsky在英特尔开始,第一个版本于2000年问世。Vadim Pisarevsky随后加入Gary Bradsky,管理英特尔的俄罗斯软件OpenCV团队。2005年,OpenCV被用在斯坦利上,该车赢得了2005年的DARPA挑战赛。后来,在Willow Garage的支持下,在Gary Bradsky和Vadim Pisarevsky的领导下,继续进行积极开发。现在,OpenCV支持与计算机视觉和机器学习有关的众多算法,并在日渐扩大。

OpenCV支持多种编程语言,如C++、Python、Java等,并可在不同平台上使用,包括Windows、Linux、OS X、Android和iOS。基于CUDA和OpenCL的高速GPU操作的接口也在积极开发中。

OpenCV-Python是OpenCV的Python API,结合了OpenCV C++ API和Python语言的最佳特性。

OpenCV-Python介绍

OpenCV-Python是一个Python库,旨在解决计算机视觉问题。

Python是一种通用的编程语言,由Guido van Rossum发起,很快就变得非常流行,主要是因为它非常简单和代码的可读性强。它使程序员能够在不降低可读性的情况下用较少的代码行来表达想法。

但是与C/C++等语言相比,Python比较慢。但是,Python可以很容易地用C/C++进行扩展,这使得我们可以用C/C++编写计算密集型代码,并创建可以作为Python模块使用的Python包装器。这给我们带来了两个好处:第一,OpenCV代码的速度和原来的C/C++代码一样快(因为它是实际的C++代码在后台工作);第二,用Python编码比C/C++更容易。OpenCV-Python是对原始的OpenCV C++实现的一个Python包装器。

OpenCV-Python使用了Numpy,它是一个高度优化的数字运算库,具有MATLAB式的语法。所有的OpenCV数组结构都被转换为Numpy数组。这也使得它更容易与其他使用Numpy的库集成,如SciPy和Matplotlib。

OpenCV-Python教程

OpenCV推出了一套新的教程,它将引导你了解OpenCV-Python中的各种功能。本指南主要是针对OpenCV 3.x版本(尽管大部分教程也适用于OpenCV 2.x)。

建议事先了解Python和Numpy的知识,因为本指南中不会涉及这些知识。为了使用OpenCV-Python编写优化的代码,熟练掌握Numpy是必须的。

本教程最初是由Abid Rahman K.在Alexander Mordvintsev的指导下作为Google Summer of Code 2013项目的一部分而开始的。

OpenCV需要你!

由于OpenCV是一个开源计划,我们欢迎所有人对库、文档和教程做出贡献。如果你在本教程中发现任何错误(哪怕是一个小的拼写错误,甚至代码或概念中的严重错误),请随时在GitHub中克隆OpenCV并提交一个request请求来纠正它。OpenCV的开发人员会检查你的拉动请求,给你重要的反馈,(一旦通过审查者的批准)它将被合并到OpenCV中。这样你就成为一个开源的贡献者 😃

随着OpenCV-Python中新模块的加入,本教程可能会进行扩展。如果你熟悉某种特定的算法,并能写出包括该算法的基本理论和显示使用实例的代码在内的教程,请这样做。

请记住,我们一起可以使这个项目获得巨大的成功!

贡献者

以下是向OpenCV-Python提交教程的贡献者名单。

Alexander Mordvintsev (GSoC-2013导师)
Abid Rahman K. (GSoC-2013实习生)

其他资源

  1. Python的快速指南-Python的一比特(英文外部)
  2. NumPy 快速上手指南(英文外部)
  3. NumPy 参考(英文外部)
  4. OpenCV 文档(英文外部)
  5. OpenCV 论坛(英文外部)

在Windows上安装OpenCV-Python

目标

在本教程中我们将学习如何在Windows系统中设置OpenCV-Python。
下面的步骤在Windows 7 64位计算机上用Visual Studio 2010和Visual Studio 2012测试通过。屏幕截图显示的是VS2012。

从预制的二进制文件中安装OpenCV

  1. 下载下面的Python软件包并安装到它们的默认位置。
    a. Python 3.x (3.4+) 或 Python 2.7.x 从这里下载。
    b. Numpy软件包(例如,使用 pip install numpy 命令)。
    c. Matplotlib (pip install matplotlib) (Matplotlib是可选的,但推荐使用,因为我们在教程中经常使用它)。
  2. 将所有软件包安装到它们的默认位置。如果是Python 2.7,Python将被安装到C:/Python27/
  3. 安装后,打开Python IDLE。输入import numpy并确保Numpy工作正常。
  4. 从GitHub或SourceForge网站下载最新的OpenCV版本,双击解压。
  5. 转到opencv/build/python/2.7文件夹。
  6. 将cv2.pyd复制到C:/Python27/lib/site-packages
  7. 打开Python IDLE,在Python终端输入以下代码。
>>> import cv2 as cv
>>> print( cv.__version__ )

如果打印出来的结果没有任何错误,恭喜你!你已经成功地安装了OpenCV-Python。

从源代码构建OpenCV

  1. 下载并安装Visual Studio和CMake。
    a. Visual Studio 2012
    b. CMake
  2. 下载并安装必要的Python软件包到其默认位置
    a. Python
    b. Numpy

注意
在这种情况下,我们使用的是32位的Python软件包的二进制文件。但是如果你想使用OpenCV的x64版本,就必须安装64位的Python软件包。问题是,没有Numpy的官方64位二进制文件。你必须自己构建它。为此,你必须使用用于构建Python的同一个编译器。当你启动Python IDLE时,它会显示编译器的详细信息。所以你的系统必须有相同的Visual Studio版本,并从源代码构建Numpy。
另一种拥有64位Python包的方法是使用第三方提供的现成的Python发行版,如Anaconda、Enthought等。虽然发行版的安装包体积会比较大,但会有你需要的一切。所有的东西都在一个单独的Shell里。你也可以下载32位版本。

  1. 确保Python和Numpy工作正常。

  2. 下载OpenCV的源代码。可以从Sourceforge(官方发布版本)或Github(最新的源代码)。

  3. 将其解压到一个文件夹中,opencv并在其中创建一个新的文件夹build。

  4. 打开CMake-GUI(开始>所有程序>CMake-GUI)

  5. 按如下方式填写字段(见下图)。
    a. 点击浏览源代码...,找到opencv文件夹。
    b. 点击浏览构建...并找到我们创建的构建文件夹。
    c. 点击 "配置"。

    d. 打开一个新的窗口来选择编译器。选择适当的编译器(这里是Visual Studio 11)并点击完成。

    e. 等待直到分析结束。

  6. 你会看到所有的字段都被标记为红色。点击WITH字段来展开它。它决定你需要哪些额外的功能。所以要标记适当的字段。如图:

  7. 现在点击BUILD字段来展开它。前面几个字段是配置构建方法。如图:

  8. 剩余的字段指定要构建的模块。由于OpenCV-Python还不支持GPU模块,你可以完全避免它以节省时间(但如果你与它们一起工作,请保留它)。如图:

  9. 现在点击ENABLE字段来展开它。确保ENABLE_SOLUTION_FOLDERS未被选中(Visual Studio Express版不支持解决方案文件夹)。如图:

  10. 还要确保在PYTHON字段中,所有的内容都被填满。(除了 PYTHON_DEBUG_LIBRARY) 如图:

  11. 最后点击 "Generate"按钮。

  12. 现在去我们的opencv/build文件夹。在那里你会发现OpenCV.sln文件。用Visual Studio打开它。

  13. 检查构建模式为Release而不是Debug。

  14. 在解决方案资源管理器中,右击解决方案(或ALL_BUILD)并构建它。它将需要一些时间来完成。

  15. 再次,右击INSTALL并构建它。现在OpenCV-Python将被安装。如下图:

  16. 最后打开Python IDLE 输入import cv2 as cv 。如果没有错误,则安装正确。

注意:
我们安装时没有安装其他支持,如TBB、Eigen、Qt、Document等。在这里我们很难解释为什么。更详细的视频将很快添加,或者你可以先自己查查。

其他资源

练习

如果你有一台windows机器,请从源码上编译OpenCV。你可以做各种各样的尝试,如果遇到任何问题,请访问OpenCV论坛并解释你的问题。

在Fedora上安装OpenCV-Python

目标

在本教程中我们将学习如何在你的Fedora系统中设置OpenCV-Python。下面的步骤是针对Fedora 18 (64-bit) 和Fedora 19 (32-bit)的测试。

简介

OpenCV-Python可以通过两种方式在Fedora上安装:1) 从Fedora软件库中的预编译二进制文件中安装;2) 从源代码中编译。在本节中,我们将看到这两种方式。
另一件重要的事情是需要额外的库。OpenCV-Python只需要Numpy(除了其他的依赖性,我们将在后面看到)。但在本教程中,我们也使用了Matplotlib来实现一些简单而漂亮的绘图目的(与OpenCV相比,我觉得它好得多)。Matplotlib是可选的,但强烈推荐。同样,我们还将看到IPython,一个交互式Python终端,这也是强烈推荐的。

从预编译二进制文件中安装Opencv-Python

在root环境的终端中输入下面的命令安装:

$ yum install numpy opencv*

打开Python IDLE或者IPython在Python控制台中输入以下代码

>>> import cv2 as cv
>>> print( cv.__version__ )

如果打印出来的结果没有任何错误,恭喜你!你已经成功地安装了OpenCV-Python。

这是很容易的。但是这里面有一个问题。Yum仓库可能并不总是包含OpenCV的最新版本。例如,在写这个教程的时候,Yum仓库包含2.4.5,而最新的OpenCV版本是2.4.6。就Python API而言,最新版本总是包含更好的支持。另外,在摄像头支持、视频播放等方面可能会出现问题,这取决于所存在的驱动程序、ffmpeg、gstreamer软件包等。

所以我个人更倾向于下一个方法,即从源代码编译。另外,在某些时候,如果你想为OpenCV做出贡献,你将需要这个。

从源代码编译OpenCV

从源代码编译一开始可能看起来有点复杂,但一旦你成功了,就没有什么复杂的了。
首先,我们要安装一些依赖项。有些是必须的,有些是可选的。可选的依赖项,如果你不想要,你可以不安装。

安装必须的依赖项

我们需要CMake来配置安装,GCC来编译,Python-devel和Numpy来创建Python附加项:

yum install cmake
yum install python-devel numpy
yum install gcc gcc-c++

接下来我们需要GTK对GUI功能的支持,相机支持(libdc1394,v4l),媒体支持(ffmpeg,gstreamer)等。

yum install gtk2-devel
yum install libdc1394-devel
yum install ffmpeg-devel
yum install gstreamer-plugins-base-devel

安装可选的依赖项

以上的依赖项足以在你的Fedora机器上安装OpenCV。但根据你的要求,你可能需要一些额外的依赖。下面给出了这些可选依赖项的清单。你可以不安装它,也可以安装它,你自己决定:)

OpenCV带有支持图像格式的文件,如PNG、JPEG、JPEG2000、TIFF、WebP等。但它可能有点旧。如果你想获得最新的库,你可以安装这些格式的开发文件。

yum install libpng-devel
yum install libjpeg-turbo-devel
yum install jasper-devel
yum install openexr-devel
yum install libtiff-devel
yum install libwebp-devel

有几个OpenCV函数是用 英特尔的线程构件(TBB) 并行化的。但是如果你想启用它,你需要先安装TBB。( 在用CMake配置安装时,不要忘记传递 -D WITH_TBB=ON 。更多细节见下文。)

yum install tbb-devel

OpenCV使用另一个库Eigen来优化数学运算。所以如果你的系统中安装了Eigen,你可以利用它。( 在用CMake配置安装时,不要忘记传递 -D WITH_EIGEN=ON 。更多细节见下文。)

yum install eigen3-devel

如果你想建立文档(是的,你可以在你的系统中用HTML创建离线版本的OpenCV完整的官方文档,并具有完整的搜索功能,这样你就不需要总是访问互联网,如果有任何问题,它是相当快的!),你需要安装Doxygen(一个文档生成工具)。

yum install doxygen

下载OpenCV

接下来我们要下载OpenCV。你可以从sourceforge网站下载OpenCV的最新版本。然后解压该文件夹。

或者你可以从OpenCV的github repo下载最新的源代码。(如果你想为OpenCV做贡献,请选择这个。它总能使你的OpenCV保持最新状态。) 为此,你需要先安装Git。

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

它将在主目录(或你指定的目录)下创建一个OpenCV文件夹。克隆可能需要一些时间,这取决于你的互联网连接。
现在打开一个终端窗口,导航到下载的OpenCV文件夹。创建一个新的build文件夹并导航到它。

mkdir build
cd build

配置和安装

现在我们已经安装了所有需要的依赖项,让我们来安装OpenCV。安装必须用CMake进行配置。它指定了要安装哪些模块,安装路径,要使用哪些额外的库,是否要编译文档和例子等等。下面的命令通常用于配置(从构建文件夹中执行)。

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..

它指定构建类型为 "发布模式",安装路径为/usr/local。请注意每个选项前的-D和末尾的.。简而言之,就是这样的格式。

cmake [-D <flag>] [-D <flag>] ..

你可以指定任何你想要的标志,但每个标志前都应该有-D。

所以在本教程中,我们安装的是支持TBB和Eigen的OpenCV。我们还建立了文档,但我们排除了性能测试和构建样本。我们还禁用了与GPU有关的模块(因为我们使用OpenCV-Python,我们不需要与GPU有关的模块。这为我们节省了一些时间)。)

*(以下所有的命令都可以在一个cmake语句中完成,但为了更好地理解,在此将其分开。) *

  • 开启TBB和Eigen支持
cmake -D WITH_TBB=ON -D WITH_EIGEN=ON ..
  • 启用文档并禁用测试和样本
cmake -D BUILD_DOCS=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF ..
  • 禁用所有GPU相关的模块
cmake -D WITH_OPENCL=OFF -D BUILD_opencv_gpu=OFF -D BUILD_opencv_gpuarithm=OFF -D BUILD_opencv_gpubgsegm=OFF -D BUILD_opencv_gpucodec=OFF -D BUILD_opencv_gpufeatures2d=OFF -D BUILD_opencv_gpufilters=OFF -D BUILD_opencv_gpuimgproc=OFF -D BUILD_opencv_gpulegacy=OFF -D BUILD_opencv_gpuoptflow=OFF -D BUILD_opencv_gpustereo=OFF -D BUILD_opencv_gpuwarping=OFF ..
  • 设置安装路径和构建类型
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..

每次你输入cmake语句,它都会打印出结果的配置设置。在你得到的最终设置中,确保以下字段被填满(下面是我得到的配置的一些重要部分)。这些字段在你的系统中也应该被适当地填写。否则就会发生一些问题。所以请检查你是否正确执行了上述步骤。

...
--   GUI:
--     GTK+ 2.x:                    YES (ver 2.24.19)
--     GThread :                    YES (ver 2.36.3)
--   Video I/O:
--     DC1394 2.x:                  YES (ver 2.2.0)
--     FFMPEG:                      YES
--       codec:                     YES (ver 54.92.100)
--       format:                    YES (ver 54.63.104)
--       util:                      YES (ver 52.18.100)
--       swscale:                   YES (ver 2.2.100)
--       gentoo-style:              YES
--     GStreamer:
--       base:                      YES (ver 0.10.36)
--       video:                     YES (ver 0.10.36)
--       app:                       YES (ver 0.10.36)
--       riff:                      YES (ver 0.10.36)
--       pbutils:                   YES (ver 0.10.36)
--     V4L/V4L2:                    Using libv4l (ver 1.0.0)
--   Other third-party libraries:
--     Use Eigen:                   YES (ver 3.1.4)
--     Use TBB:                     YES (ver 4.0 interface 6004)
--   Python:
--     Interpreter:                 /usr/bin/python2 (ver 2.7.5)
--     Libraries:                   /lib/libpython2.7.so (ver 2.7.5)
--     numpy:                       /usr/lib/python2.7/site-packages/numpy/core/include (ver 1.7.1)
--     packages path:               lib/python2.7/site-packages
...

还有许多其他的标记和设置。它留给你进一步探索。
现在你用make命令建立文件,用make install命令安装它。make install应该以root身份执行。

make
su
make install

安装结束了。所有的文件都安装在/usr/local/文件夹中。但是要使用它,你的Python应该能够找到OpenCV模块。对此你有两个选择。

  1. 将模块移到Python路径的任何文件夹中: Python的路径可以通过在Python终端输入 import sys; print(sys.path) 来找到。它将打印出许多位置。比如说将 /usr/local/lib/python2.7/Site-packages/cv2.so 移到这个文件夹中的任何一个。
su mv /usr/local/lib/python2.7/site-packages/cv2.so /usr/lib/python2.7/site-packages

但你每次安装OpenCV时都必须这样做。
2. 将/usr/local/lib/python2.7/Site-packages添加到PYTHON_PATH中: 这只需要做一次。只要打开 /.bashrc 并添加以下一行,然后注销并重新登陆。

export PYTHONPATH=$PYTHONPATH:/usr/local/lib/python2.7/site-packages

这样,OpenCV的安装就完成了。打开终端,试试import cv2 as cv
要编译文档的话,就运行下面的命令:

make doxygen

然后打开opencv/build/doc/doxygen/html/index.html 并把他添加到浏览器书签。

其他资源

练习

在你的Fedora电脑上从源码编译OpenCV。

在Ubuntu上安装OpenCV-Python

目标

在本教程中,我们将学习如何在Ubuntu系统中设置OpenCV-Python。下面的步骤是针对Ubuntu 16.04和18.04(都是64位)的测试。

OpenCV-Python可以通过两种方式安装在Ubuntu中。

  • 从Ubuntu软件库中的预建二进制文件中安装
  • 从源代码中编译。
    另一件重要的事情是需要外部库。OpenCV-Python只需要 Numpy (除了其他的依赖,我们将在后面看到)。但在本教程中,我们也使用了 Matplotlib 来实现一些简单而漂亮的绘图目的(与OpenCV相比,我觉得它好得多)。 Matplotlib 是可选的,但强烈推荐。同样,我们还将用到 IPython ,一个交互式Python终端,这也是强烈推荐的。

从预编译的二进制文件安装OpenCV-Python

这种方法在只用于编程和开发OpenCV应用程序时效果最好。
用以下命令在终端安装python3-opencv包(以root用户身份)。

$ sudo apt-get install python3-opencv

打开Python IDLE(或者IPython)输入以下的命令:

import cv2 as cv
print(cv.__version__)

如果打印出来的结果没有任何错误,恭喜你你已经成功地安装了OpenCV-Python。

这是很容易的。但是这里面有一个问题。apt软件库可能并不总是包含最新版本的OpenCV。例如,在写这个教程的时候,apt资源库包含2.4.8,而最新的OpenCV版本是3.x。

所以要想获得最新的源代码,最好是采用下一个方法,即从源代码编译。另外,在某些时候,如果你想为OpenCV作出贡献,你会需要这个。

从源码编译OpenCV

从源代码编译一开始可能看起来有点复杂,但一旦你成功了,就没有什么复杂的了。
首先,我们要安装一些依赖项。有些是必须的,有些是可选的。如果你不愿意,你可以跳过可选的依赖项。

安装必须的依赖项

我们需要CMake来配置安装,GCC来编译,Python-devel和Numpy来创建Python附加项:

sudo apt-get install cmake
sudo apt-get install gcc g++

若为python2

sudo apt-get install python-dev python-numpy

若为python3

sudo apt-get install python3-dev python3-numpy

接下来我们需要GTK对GUI功能的支持,相机支持(libdc1394,v4l),媒体支持(ffmpeg,gstreamer)等。

sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev

若为gtk2:

sudo apt-get install libgtk2.0-dev

若为gtk3:

sudo apt-get install libgtk-3-dev

安装可选的依赖项

以上的依赖性足以在你的Ubuntu机器上安装OpenCV。但是根据你的要求,你可能需要一些额外的依赖。下面给出了这些可选依赖项的清单。你可以不安装它,也可以安装它,你自己决定:)

OpenCV带有支持图像格式的文件,如PNG、JPEG、JPEG2000、TIFF、WebP等。但它可能有点旧。如果你想得到最新的库,你可以安装这些格式的系统库的开发文件。

sudo apt-get install libpng-dev
sudo apt-get install libjpeg-dev
sudo apt-get install libopenexr-dev
sudo apt-get install libtiff-dev
sudo apt-get install libwebp-dev

注意
如果你使用的是Ubuntu 16.04,你也可以安装 libjasper-dev 来增加对JPEG2000格式的系统级支持。

下载OpenCV

从OpenCV的GitHub仓库下载最新的源代码。(如果你想为OpenCV做贡献,请选择这个。为此,你需要先安装Git)

$ sudo apt-get install git
$ git clone https://github.com/opencv/opencv.git

它将在当前目录下创建一个文件夹 opencv 。克隆可能需要一些时间,这取决于你的互联网连接。

现在打开一个终端窗口,导航到下载的 opencv 文件夹。创建一个新的 build 文件夹并导航到它。

$ mkdir build
$ cd build

配置和安装

现在我们有了所有需要的依赖,让我们来安装OpenCV。安装必须用CMake进行配置。它指定了要安装哪些模块,安装路径,要使用哪些额外的库,是否要编译文档和例子等等。这些工作大部分都是通过配置好的默认参数自动完成的。

以下命令通常用于配置OpenCV库的构建(从构建文件夹中执行)。

$ cmake ../

OpenCV默认为 Release 构建类型,安装路径为 /usr/local。关于CMake选项的其他信息请参考OpenCV C++编译指南
你应该在 CMake 的输出中看到这些行 (它们意味着已经正确找到了 Python)。

--   Python 2:
--     Interpreter:                 /usr/bin/python2.7 (ver 2.7.6)
--     Libraries:                   /usr/lib/x86_64-linux-gnu/libpython2.7.so (ver 2.7.6)
--     numpy:                       /usr/lib/python2.7/dist-packages/numpy/core/include (ver 1.8.2)
--     packages path:               lib/python2.7/dist-packages
--
--   Python 3:
--     Interpreter:                 /usr/bin/python3.4 (ver 3.4.3)
--     Libraries:                   /usr/lib/x86_64-linux-gnu/libpython3.4m.so (ver 3.4.3)
--     numpy:                       /usr/lib/python3/dist-packages/numpy/core/include (ver 1.8.2)
--     packages path:               lib/python3.4/dist-packages

现在你用make命令建立文件,用 make install 命令安装它。

$ make
# sudo make install

安装已经结束。所有文件都安装在/usr/local/文件夹中。打开一个终端,尝试import cv2

import cv2 as cv
print(cv.__version__)