树莓派操作系统参数:
根用户: 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 的 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 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已经是最新的,但最好不要跳过此步骤。
接下来,我会介绍一下virtualenv和virtualenvwrapper,这是一个虚拟环境和管理的软件,它可以创建一个与外界完全隔离的环境,有助于软件环境,版本的隔离,在实际的开发中尤为关键。
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
在之前的教程中,我建议使用您最喜欢的基于终端的文本编辑器,如 vim, emacs或 nano来更新 〜/.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 :
source ~/.profile
注意:我建议运行 source ~/.profile 。 每次打开新终端时的配置文件,以确保您的系统变量已正确设置。
使用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环境。
如果没有,重复之前的两行命令。
我们唯一的Python依赖是NumPy,一个用于数字处理的Python包:
pip install numpy
这个过程可能会花去10分钟以上的时间,耐心等待。后面编译更久。
仔细检查您是否在 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的输出!
如果这是你第一个创建的虚拟环境,那么下面的路径与本文相同,如果不是,要注意记录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
我们的最后一步是将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
$ 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
好了就这么结束了。