树莓派安装OpenCV-4.1.0及Contrib


这里参考了前辈安装OpenCV 3的一些过程和方法:
在Raspberry Pi上安装OpenCV 3 + Python

安装前的系统环境准备

树莓派操作系统参数:
根用户: root@raspberrypi
系统版本: Raspbian 9.9 stretch
Linux内核版本: armv7l Linux 4.14.98-v7+

以上的版本都是发稿前,树莓派官方最新的系统。
建议您在安装前纯净安装 Raspbian 9.9 stretch,而不是从老版本升级而来,可能会有一些问题。
树莓派

起步(拓展文件系统)

对于新安装的系统我们的第一步就是拓展文件系统,扩展您的文件系统以包含micro-SD卡上的所有可用空间:

// 打开树莓派配置
sudo raspi-config

然后选择“高级选项”菜单项:

树莓派配置
然后选择“扩展文件系统”:
在这里插入图片描述
选择A1 拓展系统文件选项后,我们需要对树莓派进行重启:

// 重启
sudo reboot

重新启动后,您的文件系统应该已扩展为包含micro-SD卡上的所有可用空间。您可以验证该盘已被执行扩展 df -h 和检查的输出:

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        30G  4.2G   24G  15% /
devtmpfs        434M     0  434M   0% /dev
tmpfs           438M     0  438M   0% /dev/shm
tmpfs           438M   12M  427M   3% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           438M     0  438M   0% /sys/fs/cgroup
/dev/mmcblk0p1   42M   21M   21M  51% /boot
tmpfs            88M     0   88M   0% /run/user/1000

我这里使用的是32G的存储卡。小容量可以考虑卸载一些没有用的软件。

安装依赖项

从这里开始就正式的进入了安装OpenCV 4的进程,我们相对已有的软件包更新。

sudo apt-get update && sudo apt-get upgrade

然后我们需要安装一些开发人员工具,包括CMake,它可以帮助我们配置OpenCV构建过程:

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

接下来,我们需要安装一些图像I / O包,允许我们从磁盘加载各种图像文件格式。此类文件格式的示例包括JPEG,PNG,TIFF等:

sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev

正如我们需要图像I / O包一样,我们也需要视频I / O包。这些库允许我们从磁盘读取各种视频文件格式,以及直接使用视频流:

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

OpenCV库附带一个名为highgui的子模块 ,用于向屏幕显示图像并构建基本GUI。为了编译 highgui模块,我们需要安装GTK开发库

sudo apt-get install libgtk2.0-dev libgtk-3-dev

OpenCV中的许多操作(即矩阵操作)可以通过安装一些额外的依赖项进一步优化:

sudo apt-get install libatlas-base-dev gfortran

这些优化库对于资源受限设备(如Raspberry Pi)尤为重要。
最后,让我们安装Python 2.7和Python 3头文件,这样我们就可以使用Python绑定编译OpenCV:

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

如果您正在使用全新安装的操作系统,那么这些版本的Python可能已经是最新版本。

下载OpenCV源代码

现在我们已经安装了依赖项,让我们从官方的OpenCV存储库中获取OpenCV 的 4.1.0存档。
今后可以通过修改版本号,获取最新的源码。

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

我们需要完整安装 OpenCV 3(例如,可以访问SIFT和SURF等功能),因此我们还需要获取opencv_contrib存储库:

$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.1.0.zip
$ unzip opencv_contrib.zip

如果你觉得太慢,那就直接去以上的网址直接下载后放到**~**目录下。

百度云盘:链接:https://pan.baidu.com/s/12DZbzZwkffzGv8qyQ21Mpw
提取码:4qpk

**注意:**确保 opencv和 opencv_contrib版本相同(在本例中为 4.1.0)。如果版本号不匹配,那么您可能会遇到编译时或运行时错误。

基于Python 3环境的安装

Python 2的环境太古老,我就不在给出安装的细节,总的来说,大同小异,我更建议大家过渡到Python 3上来。
在我们开始在Raspberry Pi 3上编译OpenCV之前,我们首先需要安装 pip,一个Python包管理器:

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

发出这些命令时,您可能会收到一条消息,指出pip已经是最新的,但最好不要跳过此步骤。

接下来,我会介绍一下virtualenvvirtualenvwrapper,这是一个虚拟环境和管理的软件,它可以创建一个与外界完全隔离的环境,有助于软件环境,版本的隔离,在实际的开发中尤为关键。

Python社区中的标准做法是使用某种虚拟环境,因此我强烈建议您执行相同的操作:

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

既然已经安装了 virtualenv和 virtualenvwrapper,我们需要更新 〜/.profile 。配置文件包含文件底部的以下行:

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

在之前的教程中,我建议使用您最喜欢的基于终端的文本编辑器,如 vimemacsnano来更新 〜/.profile 如果您对这些编辑器感到满意,请继续更新文件以反映上述更改。
否则,您应该只使用 cat和输出重定向来处理更新 〜/.profile :

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

我们需要重新加载它以确保更改生效。你可以强制重新加载 〜/.profile :

  1. 注销然后重新登录。
  2. 关闭终端实例并打开一个新实例
  3. 或者我个人最喜欢的,只需使用 source命令:
source ~/.profile

注意:我建议运行 source ~/.profile 。 每次打开新终端时的配置文件,以确保您的系统变量已正确设置。

创建Python虚拟环境

使用Python 3,需要使用此命令:

mkvirtualenv cv -p python3

在这里我再次强调:在 cv中 Python的虚拟环境是完全独立的,隔离来自包括在下载Raspbian默认Python版本。全局环境中的任何Python包site- packages目录都不可用于 cv虚拟环境。同样地,安装在任何Pythonsite- packages的包不会可用于全局安装的Python。当您在Python虚拟环境中工作时,请记住这一点,这将有助于避免许多混乱和令人头疼的问题。

完成过后,我们运行一下命令,确保自己处于cv的环境中。

$ source ~/.profile
$ workon cv

当你看到在根用户前有(cv)时,就说明已经进入cv环境。
cv环境下
如果没有,重复之前的两行命令。

在Raspberry Pi上安装NumPy

我们唯一的Python依赖是NumPy,一个用于数字处理的Python包:

pip install numpy

这个过程可能会花去10分钟以上的时间,耐心等待。后面编译更久。

(重头戏来了)编译并安装OpenCV

仔细检查您是否在 cv虚拟环境中 ,如果没有,只需执行 workon cv:

一旦确保您处于 cv虚拟环境中,我们就可以使用CMake设置我们的构建:

$ cd ~/opencv-4.1.0/
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-4.1.0/modules \
    -D BUILD_EXAMPLES=ON ..

现在,在我们进入实际编译步骤之前,请确保检查CMake的输出!
Cmake结果
如果这是你第一个创建的虚拟环境,那么下面的路径与本文相同,如果不是,要注意记录packages path这一行,最终的so文件的放置,需要该路径。
在编译之前配置交换空间大小
在开始编译过程之前,应该 增加交换空间大小。这使OpenCV能够与 Raspberry PI的所有四个内核一起编译,而不会因内存问题而导致编译挂起。
打开 / etc / dphys - swapfile ,然后编辑 CONF_SWAPSIZE 变量:

# set size to absolute value, leaving empty (default) then uses computed value
#   you most likely don't want this, unless you have an special disk situation
# CONF_SWAPSIZE=100
CONF_SWAPSIZE=1024

请注意,我已经注释掉100MB,并添加了1024MB。这是在Raspbian上使用多个内核进行编译的秘诀。

如果跳过此步骤,OpenCV可能无法编译。
要激活新的交换空间,请重新启动交换服务:

$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start

注意:可以烧掉Raspberry Pi microSD卡,因为闪存的写入次数有限,直到卡不能工作。这是 强烈建议您更改此设置恢复到默认你完成编译和测试安装(见下文)时。
如果是对OpenCV 4版本的进行安装,在此之前要做一些小的处理,就是关于boostdesc和vgg文件缺失导致的编译失败问题。
首先我们要进入到/home/pi/opencv_contrib-4.1.0/modules/xfeatures2d/src目录下,将我百度云盘中的文件boostdesc+vgg_generated.rar解压后的文件放入,不要放弃他多余的东西,只要放入压缩包中的几个文件

然后我们进入到/home/pi/opencv-4.1.0/modules/features2d/test目录下,将我百度云盘中的文件test_hpp.rar中的文件,解压后放入,不要放弃他多余的东西,只要放入压缩包中的几个文件
然后,我们要对上面几个头文件所对应的cpp文件进行修改:
test_detectors_invariance.cpp文件修改如下:

//test_detectors_invariance.cpp
#include "test_precomp.hpp"
#include "test_invariance_utils.hpp" //修改后
#include "test_detectors_invariance.impl.hpp"//修改后

test_detectors_regression.cpp文件修改如下:

#include "test_precomp.hpp"

namespace opencv_test { namespace {
const string FEATURES2D_DIR = "features2d";
const string IMAGE_FILENAME = "tsukuba.png";
const string DETECTOR_DIR = FEATURES2D_DIR + "/feature_detectors";
}} // namespace

#include "test_detectors_regression.impl.hpp" //修改后

test_descriptors_regression.cpp文件修改如下:

#include "test_precomp.hpp"

namespace opencv_test { namespace {
const string FEATURES2D_DIR = "features2d";
const string IMAGE_FILENAME = "tsukuba.png";
const string DESCRIPTOR_DIR = FEATURES2D_DIR + "/descriptor_extractors";
}} // namespace

#include "test_descriptors_regression.impl.hpp" //修改后

test_descriptors_invariance.cpp文件修改如下:

#include "test_precomp.hpp"
#include "test_invariance_utils.hpp"//修改后
#include "test_descriptors_invariance.impl.hpp"//修改后

最后,我们现在准备编译OpenCV:

make -j4

采用4线程去编译源码,速度会快很多。
一旦OpenCV 4完成编译,您的输出应该类似于我的下面:
在这里插入图片描述
我就借用别人3.3.0版本的编译结果图,我们的4.1.0也是一样的。
完成后,您需要做的就是在Raspberry Pi 3上安装OpenCV 3:

$ sudo make install
$ sudo ldconfig

完成在Pi上安装OpenCV

我们的最后一步是将OpenCV绑定symlink到 Python 3.5的cv虚拟环境中:
这里的地址要参考Cmake时结果中packages path,第一次安装应该与本文一致。

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

老实说,我不知道为什么,也许这是CMake脚本中的一个错误,但是在编译Python 3的OpenCV 4绑定时输出的文件命名为 cv2 .cpython - 35m - arm - linux - gnueabihf .so。(或某些变体)而不是简单的 cv2.so所以,我们要修改命名。

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

最终:OpenCV 4绑定symlink到 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

测试您的OpenCV 4安装

$ source ~/.profile 
$ workon cv
$ python
>>> import cv2
>>> cv2.__version__
'4.1.0'
>>>

从我自己的终端的屏幕截图中可以看出,OpenCV 4已成功安装在我的Raspberry Pi 3 + Python 3.5环境中:
结果图

总结

到这里安装就结束了,可以删除之前的源代码包,释放空间:

$ rm -rf opencv-4.1.0 opencv_contrib-4.1.0

但是一定要确保安装成功,不然后果严重。

改回交换空间的大小。
打开 / etc / dphys - swapfile ,然后编辑 CONF_SWAPSIZE 变量:

# set size to absolute value, leaving empty (default) then uses computed value
#   you most likely don't want this, unless you have an special disk situation
CONF_SWAPSIZE=100
# CONF_SWAPSIZE=1024

要恢复到较小的交换空间,请重新启动交换服务:

$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start

好了就这么结束了。

猜你喜欢

转载自blog.csdn.net/qq_27971677/article/details/90400118