目录
第一次写文章,记录一下暑假里做的东西 |•’-’•)。
前言
大家在安装OpenCV的时候一定要找到和自己的树莓派&树莓派系统对应的教程,我一开始看的是树莓派3b的安装教程,中途会报很多错误,非常头疼。
pyimagesearch上可以找到各种系统和版本的安装教程,还有许多OpenCV相关教程,对于入门十分友好。
参考:(pyimagesearch) Install OpenCV 4 on Raspberry Pi 4 and Raspbian Buster
本文是对链接中文章的简化翻译,为了让大家快速在树莓派4b Raspbian Buster系统上安装OpenCV 4,关于系统安装的内容和一些解释可能会跳过,如果想要了解具体内容可以点原文链接。
第1步 扩展文件系统并回收空间
运行 raspi-config 并扩展您的文件系统:
$ sudo raspi-config
选择 Advanced Options 选项:
然后选择 Expand filesystem:
选择完之后移到最下方选 Finish,系统可能会提示你重启,如果没有的话可以执行:
$ sudo reboot
重启之后你可以通过执行 df -h 来检查磁盘是否已经被扩展:
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 29G 5.3G 23G 20% /
devtmpfs 1.8G 0 1.8G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 8.6M 1.9G 1% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mmcblk0p1 253M 40M 213M 16% /boot
tmpfs 386M 0 386M 0% /run/user/1000
但是,即使扩展了文件系统,也已经使用了32GB卡中的15%。
建议删除Wolfram Engine和LibreOffice,可以在Raspberry Pi上回收约1GB的空间:
$ sudo apt-get purge wolfram-engine
$ sudo apt-get purge libreoffice*
$ sudo apt-get clean
$ sudo apt-get autoremove
第2步 安装依赖项
安装之前建议换成国内源,否则很慢还容易出错。
换源:树莓派4B换清华源并更换系统源(Raspbian-buster系统)
如果不是buster系统记得把buster关键字换成对应的系统。
更新和升级现有的软件包:
$ sudo apt-get update && sudo apt-get upgrade
然后,我们需要安装一些开发人员工具,包括CMake:
$ sudo apt-get install build-essential cmake pkg-config
接下来,我们需要安装一些图片I / O包,允许我们从磁盘加载各种图片文件格式,包括JPEG,PNG,TIFF等:
$ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng-dev
同理,要安装视频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 libfontconfig1-dev libcairo2-dev
$ sudo apt-get install libgdk-pixbuf2.0-dev libpango1.0-dev
$ sudo apt-get install libgtk2.0-dev libgtk-3-dev
通过安装一些额外的依赖项,可以进一步优化OpenCV内部的一些操作(即矩阵操作):
$ sudo apt-get install libatlas-base-dev gfortran
这些优化库对于资源受限的设备(例如树莓派)尤其重要。
以下命令适用于步骤 4a,当然也不会影响步骤 4b。 它们用于HDF5数据集和Qt GUI:
$ sudo apt-get install libhdf5-dev libhdf5-serial-dev libhdf5-103
$ sudo apt-get install libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
最后,安装 Python 3 头文件,以便我们可以使用Python绑定编译OpenCV:
$ sudo apt-get install python3-dev
第3步 创建Python虚拟环境并安装NumPy
安装 pip:
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py
$ sudo python3 get-pip.py
$ sudo rm -rf ~/.cache/pip
安装 virtualenv 和 virtualenvwrapper:
$ sudo pip install virtualenv virtualenvwrapper
安装完之后,打开 ~/.bashrc 文件:
$ nano ~/.bashrc
并把以下内容添加到文件最后:
# virtualenv and virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh
保存之后退出,然后重新加载 ~/.bashrc:
$ source ~/.bashrc
到这一步,我遇到了一个错误(如果没有报错直接跳到 创建 Python 3 虚拟环境):
Error: Environment /Users/myuser/.virtualenvs/iron does not contain activation script
解决方法:
将上面的3行代码再加两行,也就是在文件中加入以下五行代码,然后重新加载 ~/.bashrc。
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv
source /usr/local/bin/virtualenvwrapper.sh
export VIRTUALENVWRAPPER_ENV_BIN_DIR=bin # <== This line fixed it for me
参考链接:Error: Environment /Users/myuser/.virtualenvs/iron does not contain activation script
创建 Python 3 虚拟环境:
$ mkvirtualenv cv -p python3
在这里,我们将使用Python 3创建一个名为cv的Python虚拟环境。
如果你的RPi上装有Raspberry Pi摄像机模块,那么还应该安装PiCamera API:
$ pip install “picamera[array]”
第4步 1分钟快速安装或者2小时完整安装
现在有两种选择。
步骤 4a:用pip安装OpenCV 4(快速安装)
这种方法速度快而且简单,90%的项目运用这种方法安装的OpenCV都可以实现,推荐初学者用这种方法。 安装完之后,可以直接跳到第5步测试安装。
步骤 4b:从源代码编译OpenCV 4(完整安装,我选择的安装方法)
此方法提供了完整的OpenCV 4安装。根据Raspberry Pi不同的处理器,需要2-4小时。(我记得我没用这么久,大概一个多小时就弄完了)
步骤4a 用pip安装OpenCV 4(快速安装)
$ pip install opencv-contrib-python==4.1.0.25
有原文读者说,通过pip安装的某些版本的OpenCV 4在Raspberry Pi上无法正常工作。 如果你没有使用上面这个版本的OpenCV,那么从Python导入cv2时,可能会遇到错误 “undefined symbol: __atomic_fetch_add8″ for libatomic。
完成这一步之后你可以直接跳到第5步测试是否安装成功。
步骤4b 从源代码编译OpenCV 4(完整安装)
注意:如果已经根据步骤4a安装了,就不要遵循步骤4b。
首先下载适用于OpenCV和OpenCV_contrib存储库的源代码,然后解压:
$ cd ~
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.1.1.zip
$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.1.1.zip
$ unzip opencv.zip
$ unzip opencv_contrib.zip
$ mv opencv-4.1.1 opencv
$ mv opencv_contrib-4.1.1 opencv_contrib
我跟原文一样用了OpenCV 4.1.1,你可以用比4.1.1更新的版本。
增加SWAP空间
在开始编译之前,必须增加SWAP空间。 增加SWAP使你能够使用Raspberry Pi的所有四个内核来编译OpenCV(并且不会由于内存耗尽而导致编译挂起)。
打开 /etc/dphys-swapfile 文件:
$ sudo nano /etc/dphys-swapfile
编辑 CONF_SWAPSIZE 变量,将交换空间从100MB增加到2048MB:
# 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=2048
(根据原作者的测试,在OpenCV编译时,2048MB的交换空间能最有效地防止lock-up。)
保存并退出。如果不增加SWAP,你的树莓派很可能在编译过程中挂起。
重启swap服务:
$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start
在Raspbian Buster上编译并安装OpenCV 4
现在,我们准备在Raspberry Pi 4上编译并安装完整的、经过优化的OpenCV库。
使用workon命令确保您处于cv虚拟环境中:
$ workon cv
然后,将NumPy(OpenCV依赖项)安装到Python虚拟环境中:
$ pip install numpy
配置构建:
$ cd ~/opencv
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE
-D CMAKE_INSTALL_PREFIX=/usr/local
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules
-D ENABLE_NEON=ON
-D ENABLE_VFPV3=ON
-D BUILD_TESTS=OFF
-D INSTALL_PYTHON_EXAMPLES=OFF
-D OPENCV_ENABLE_NONFREE=ON
-D CMAKE_SHARED_LINKER_FLAGS=-latomic
-D BUILD_EXAMPLES=OFF ..
CMake完成后,请务必检查Python 3部分下的CMake输出:
继续向上滚动以确保已设置 “Non-Free algorithms” :
现在可以开始编译了:
$ make -j4
假设OpenCV编译没有错误(如上面的截图所示),那么就可以在Raspberry Pi上安装经过优化的OpenCV版本了:
$ sudo make install
$ sudo ldconfig
重置SWAP
打开 /etc/dphys-swapfile 文件,然后执行以下操作:
- 将 CONF_SWAPSIZE 重置为100MB。
- 重新启动swap服务。
在Raspberry Pi上符号链接OpenCV 4
符号链接是从一个目录指向系统上其他位置的文件或文件夹的一种方式。 对于此子步骤,我们将cv2.so绑定符号链接到你的cv虚拟环境中:
$ cd /usr/local/lib/python3.7/site-packages/cv2/python-3.7
$ sudo mv cv2.cpython-37m-arm-linux-gnueabihf.so cv2.so
$ cd ~/.virtualenvs/cv/lib/python3.7/site-packages/
$ ln -s /usr/local/lib/python3.7/site-packages/cv2/python-3.7/cv2.so cv2.so
第5步 测试是否安装成功
开启cv虚拟环境之后,启动Python shell,然后尝试导入OpenCV库:
$ cd ~
$ workon cv
$ python
>>> import cv2
>>> cv2.version
‘4.1.1’
>>>
正确显示OpenCV版本就是安装成功了!(๑•̀ㅂ•́)و✧