基于Ubuntu16.04和Cuda8.0上安装OpenCV3.1.0

本博文会介绍如何在Ubuntu16.04上安装OpenCV3.1.0版本,有些人会有疑问,之前用过这条命令sudo apt-get install python-opencv 安装OpenCV,也可以使用,但注意通过上面命令安装的OpenCV不是最新版本的,一般是2.x版本的。

闲话少说,我们下面开始在Ubuntu16.04上安装OpenCV3.1.0。

Step1:在Ubuntu16.04 安装一些OpenCV需要的依赖项

首先打开你的terminal对已安装的软件包进行更新和升级:

$sudo apt-get update
#update 是用来同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,获取最新的软件包

$sudo apt-get upgrade
#upgrade升级已安装的所有软件包,升级之后的版本就是本地索引里的

下一步安装一些开发工具:

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

OpenCV 是图像处理和计算机视觉的库。为了方便后面学习图像和视频的处理,这里安装一些必要的库。

$sudo apt-get install libjpeg8-dev libtiff5-dev libjasper-dev libpng12-dev
#以上从磁盘下载图片的库
$sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
$sudo apt-get install libxvidcore-dev libx264-dev
#上面两行命令来安装用来处理视频流和从摄像头采集帧的库

接下来安装处理OpenCV GUI 操作的模块——highgui,其实这个模块是依赖于GTK库的,GTK库通过下面的命令安装:

$sudo apt-get install libgtk-3-dev

安装一些能够优化或者是提升OpenCV功能的库,像对矩阵的处理等。

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

安装python2.7和python3.5类库的头文件:

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

PS: linux发行版通常会把类库的头文件和相关的pkg-config分拆成一个单独的xxx-dev(el)包。如果你需要安装源外(第三方)的Python类库而这个类库内还有编译的调用Python API的C/C++文件时,需要安装python-dev。下面我们会对OpenCV执行cmake,所以次响必须安装,否则会报错。

Step2:下载OpenCV源文件:
下载最新版本的OpenCV zip文件并解压。

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

除了这个之外,我们还需要下载OpenCV_contrib 文件

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

对于OpenCV3+来说,一些功能被移到了opencv_contrib里,像SIFT和SURF,所以我们同样需要这个文件夹。
注意: opencv 和opencv_contrib的版本必须是一致的,opencv-3.1.0必须和opencv_contrib-3.1.0后面的数字保持一致,这样编译的过程才不会出错。

Step3:设置Python的环境,python2+或者是Python3+
这一步,我们开始设置Python的开发环境,首先让我们安装pip

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

在这介绍一个可以设置Python虚拟环境的工具,virtualenvvirtualenvwrapper。他们可以用来设置独立的Python环境,对于每一个项目来说,你可以根据需要设置为使用python2.7.12 或者是Python3.5。之前我也接触过virtualenvvirtualenvwrapper,但是没有搞清楚怎么用,所以放弃了。通过这次的再次使用,我感觉到它们是非常好用的工具。当然,你也可以选择不适用,Ubuntu16.04默认的Python版本是python2.7.12 。

安装virtualenvvirtualenvwrapper

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

virtualenvvirtualenvwrapper安装完成之后我们需要升级~/.bashrc文件。使用vi或者vim打开~/.bashrc文件,将下面的行添加到文件的最后即可。

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

修改~/.bashrc文件之后,重新加载修改项

source ~/.bashrc

创建python的虚拟环境
使用mkvirtualenv创建python的虚拟环境

使用下面的命令创建python2的虚拟环境:

$mkvirtualenv cv3 -p python2

如果你想创建Python3的虚拟环境,和上面一样,只不过是把Python2换成Python3,用下面的命令创建。

$mkvirtualenv cv3 -p python3

PS:上面命令中的cv3是你想创建虚拟环境的名字,你可以任意设置成任意的名字,在这我设置成了cv3。同时,你也可以同时用不同的名字设置几个不同的Python环境,除了cv3,我还设置了另外一个Python的环境keras

下面我们用workon命令去切换Python的虚拟环境:

基于Ubuntu16.04和Cuda8.0上安装OpenCV3.1.0_第1张图片

从上图可以看出,我设置连个Python虚拟环境,一个是python2.7.12版本的keras,另一个是Python3.5.2版本的cv3。如果你想退出虚拟环境,使用deactivate命令,如上图所示。
PS:当你想在某个虚拟环境下工作时,切记使用workon 名字这个命令,保证在username@username前面有(你的虚拟环境的名字)
。例如上图所示在shu@shu前面有(cv3)或者(keras)的名字

在Python的虚拟环境中安装Numpy包。
首先进入虚拟环境:workon cv3
使用下面命令安装numpy的包

$pip install numpy

注意:使用上面的命令一定不要加sudo,使用sudo将不会把numpy包安装到虚拟环境中,而是安装到了root。我安装的时候一直使用sudo导致我不能在虚拟环境中使用numpy,用了好长时间才搞定。

Step4:在Ubuntu16.04上设置并编译OpenCV
首先进入虚拟环境:workon cv3
确保进入虚拟环境后,我们使用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/cv3/bin/python \
-D BUILD_EXAMPLES=ON ..

PS:倒数第二行-D PYTHON_EXECUTABLE=~/.virtualenvs/cv3/bin/python \中的cv3一定要和mkvirtualenv cv3 -p python3中的你设置的名字cv3一致。如我想在keras虚拟环境中编译,我需要改成-D PYTHON_EXECUTABLE=~/.virtualenvs/keras/bin/python \。此处一定要注意。

编译结束之后。你会看到屏幕上会输出如下图的内容。

基于Ubuntu16.04和Cuda8.0上安装OpenCV3.1.0_第2张图片
每行括号内显示的是(ver 3.5.2),那对于python2.7.12的虚拟环境来说,显示的将会是(ver 2.7.12)。如果你的输出如上图所示,继续进行编译。继续在build文件夹下执行:

make (可以加上-j4或者是-j8,根据你GPU的核数定,也可以不加)

make成功之后,执行下面的命令:

$sudo make install
$sudo ldconfig

Step5: 创建链接,opencv安装完成
在完成sudo make install之后,opencv+python的捆绑文件将会在/usr/local/lib/python3.5/site-packages/文件夹下。用下面命令验证:

$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

PS:我是在python3.5的虚拟环境下安装的,所以安装完成后的文件会在/usr/local/lib/python3.5/site-packages/文件夹下,如果你在python2.7.12的虚拟环境下安装的,去/usr/local/lib/python2.7/site-packages/文件夹下。

修改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重命名之后,我们将opencv的捆绑文件sym-link到Python的虚拟环境中去。

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

Step6: 测试OpenCV
打开一个新的终端(Terminal),切换到安装OpenCV的Python虚拟环境中。

Ctrl+Alt+T
$workon cv3
$python
>>>import cv2
>>>cv2.version

如果得到如下图所示的结果,恭喜你,你已经成功的在Python的虚拟环境中安装好了OpenCV3.1.0。

基于Ubuntu16.04和Cuda8.0上安装OpenCV3.1.0_第3张图片

至此,已经成功的在Ubuntu16.04上安装了OpenCV3.1.0。可以开始你的OpenCV和Python的学习之旅了。

安装过程中可能会遇到的问题

问题1:

在执行make命令的时候,可能会在进度的60%左右出现一个错误:

error: ‘NppiGraphcutState’ has not been declared

modules/cudalegacy/CMakeFiles/opencv_cudalegacy.dir/build.make:290: recipe for target ‘modules/cudalegacy/CMakeFiles/opencv_cudalegacy.dir/src/graphcuts.cpp.o’ failed
make[2]: *** [modules/cudalegacy/CMakeFiles/opencv_cudalegacy.dir/src/graphcuts.cpp.o] Error

原因: GraphCut 在cuda7.5中弃用,而且在cuda8.0中移除了。
解决办法:修改 ~/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp文件
把第45行修改成:

#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) || (CUDART_VERSION >= 8000)

即在 \#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) 加上 || (CUDART_VERSION >= 8000)

问题2:

执行make时,会在80%左右出现 :

fatal error: hdf5.h: No such file or directory
opencv_contrib-3.1.0/modules/hdf/include/opencv2/hdf/hdf5.hpp:40:18: fatal error: hdf5.h: No such file or directory

原因:找不到hdf5.h的路径
解决办法:在opencv_contrib-3.1.0/modules/hdf/include/opencv2/hdf/hdf5.hpp 文件中修改第40行

#include 修改成#include "/usr/include/hdf5/serial/hdf5.h"

PS:每次修改文件后可直接执行make命令,不需要执行make clean。因为执行make clean后会重新从头编译,那样会浪费时间。

你可能感兴趣的:(OpenCV+python)