最近给树莓派买了一些传感器,感觉能做的事更多了,那就先抄一个机器视觉的玩具练练手吧~当然,怎么能少了OpenCV呢[奸笑]
参考:Raspbian Stretch: Install OpenCV 3 + Python on your Raspberry Pi
1 扩展存储卡空间
运行树莓派配置sudo raspi-config,选择”Advanced Options”,选择”Expand filesystem”,按提示重启。
使用df -h检查存储空间。
当然,如果空间仍然不够用,可以删点东西:
sudo apt-get purge wolfram-enginesudo apt-get purge libreoffice*sudo apt-get cleansudo apt-get autoremove2 安装依赖
2.1 更新系统
当然,安装依赖前先将系统更新至最新:
sudo apt-get update && time sudo apt-get upgrade && time sudo apt-get dist-upgrade2.2 安装编译/开发工具
安装包括cmake在内的开发工具,帮助我们配置并编译opencv:
sudo apt-get install build-essential cmake pkg-config2.3 图片相关依赖
安装图片I/O相关包,包括常见的JPEG、PNG、TIFF等:
sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev2.4 视频相关依赖
安装读取视频、处理视频流的相关依赖:
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-devsudo apt-get install libxvidcore-dev libx264-dev2.5 highgui相关依赖
安装OpenCV时会附带一个叫做highgui的子模块,该模块使用GUI界面显示图片,要使得该模块能够正常编译,需要安装:
sudo apt-get install libgtk2.0-dev libgtk-3-dev2.6 优化相关依赖
通过安装一些依赖可以优化OpenCV内部的矩阵运算过程,这些优化依赖对像树莓派这样计算资源受限的设备来说尤为重要:
sudo apt-get install libatlas-base-dev gfortran2.7 Python头文件
为了通过Python使用OpenCV库,在编译时需要Python头文件等资源:
sudo apt-get install python2.7-dev python3-dev3 下载OpenCV源码
3.1 OpenCV
我们从OpenCV官网下载最新版源码(版本3.4.3),该版本带有深度神经网络模块,推荐从本机下载并上传树莓派,因为本机迅雷下器比较快🤦:
scp ./Downloads/cv_3.4.3.zip pi@192.168.1.108:./unzip cv_3.4.3.zip3.2 OpenCV高级功能
我们希望能够使用OpenCV的所有功能(包括如SIFT、SURF在内的高级功能),需要下载相应版本的opencv_contrib:
scp ./Downloads/cv_c_3.4.3.zip pi@192.168.1.108:./unzip cv_c_3.4.3.zip4 Python版本控制
我习惯使用conda,因此下了个berryconda,上传树莓派(还是因为迅雷更快🤦):
scp ./Downloads/Berryconda3-2.0.0-Linux-armv7l.sh pi@192.168.1.108:./并安装:
chmod +x Berryconda3-2.0.0-Linux-armv7l.sh./Berryconda3-2.0.0-Linux-armv7l.sh安装完成之后更新conda:
conda update --all新建名叫cv的环境:
conda create -n cv python=3.5.3激活环境:
source activate cv# 退出环境#source deactivate安装Numpy,需要比较长的时间:
conda install numpy关于原文使用pip而这里使用conda的参考原因(编译选项问题导致conda安装的Python与pip安装的Numpy不兼容)。
5 其他软件包
因为个人爱好和习惯,我又安装了TensorFlow以及tesseract:
sudo apt install libatlas-base-devpip install tensorflowsudo apt-get install tesseract-ocrpip install pytesseract6 构建
6.1 解压并构建
cd ~/opencv-3.4.3/mkdir buildcd buildcmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.4.3/modules \ -D BUILD_EXAMPLES=ON ..6.2 检查构建输出
务必检查CMake构建输出中Python解释器/库等信息,正常构建完成的信息应包含类似:
-- Python 3:-- Interpreter: /home/pi/berryconda3/envs/cv/bin/python3 (ver 3.5.3)-- Libraries: /usr/lib/arm-linux-gnueabihf/libpython3.5m.so (ver 3.5.3)-- numpy: /home/pi/berryconda3/envs/cv/lib/python3.5/site-packages/numpy/core/include (ver 1.15.1)-- packages path: lib/python3.5/site-packages--6.3 修改SWAP配置
在开始编译前,先调整一下虚拟内存大小,使得编译过程能够利用树莓派的全部四颗核心,避免编译过程因为内存不足而挂起:
sudo vim /etc/dphys-swapfile# dphys-swapfile:# CONF_SWAPSIZE=100CONF_SWAPSIZE=1024再重启虚拟内存服务:
sudo /etc/init.d/dphys-swapfile stopsudo /etc/init.d/dphys-swapfile start注意:在完成所有编译、安装,且试验成功后,记得吧虚拟内存改回去,否则据说容易烧卡。
7 编译
终于可以开始编译了,大约需要一个半小时:
make -j4编译时树莓派会启用全部四颗核心,因此强烈建议开启散热风扇,编译时的top CPU利用率:

8 安装
将编译完成的OpenCV安装在系统中:
sudo make installsudo ldconfig此时OpenCV及Python支持已经安装再/usr/local/lib/python3.5/site-packages目录下了:
ls -l /usr/local/lib/python3.5/site-packages/总用量 4628-rw-r--r-- 1 root staff 4738076 9月 28 23:16 cv2.cpython-35m-arm-linux-gnueabihf.so出于某种原因,编译完成的的.so文件叫做cv2.cpython-35m-arm-linux-gnueabihf.so,我们需要将其重命名:
cd /usr/local/lib/python3.5/site-packages/sudo mv cv2.cpython-35m-arm-linux-gnueabihf.so cv2.so之后再将其链接在conda的cv环境中:
cd ~/berryconda3/envs/cv/lib/python3.5/site-packages/ln -s /usr/local/lib/python3.5/site-packages/cv2.so cv2.so9 测试
在cv环境中测试:
source activate cvpython>>> import cv2>>> cv2.__version__'3.4.3'>>>10 一些问题
一开始我使用python 3.6.6:
conda create -n cv python=3.6然后编译:
cd ~/opencv-3.4.3/mkdir buildcd buildcmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.4.3/modules \ -D BUILD_EXAMPLES=ON ..报错:
-- Found PythonInterp: /usr/bin/python2.7 (found suitable version "2.7.13", minimum required is "2.7")-- Found PythonLibs: /usr/lib/arm-linux-gnueabihf/libpython2.7.so (found suitable exact version "2.7.13")-- Found PythonInterp: /home/pi/berryconda3/envs/cv/bin/python3 (found suitable version "3.6.6", minimum required is "3.4")-- Could NOT find PythonLibs (missing: PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS) (Required is exact version "3.6.6")即树莓派上还没有python3.6-dev,仅有python3.5-dev(即python 3.5.3-0版本),于是我打算用cmake -D指定,或是export环境变量,发现报错依然存在:
cd ~/opencv-3.4.3/mkdir buildcd buildcmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.4.3/modules \ -D PYTHON_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \ -D PYTHON_LIBRARY=$(python -c "import distutils.sysconfig as sysconfig; print(sysconfig.get_config_var('LIBDIR'))") \ -D BUILD_EXAMPLES=ON ..参考CMake cannot find PythonLibs #8174的说明想修改cmake文件也不成功。
通过Debian软件包搜索可知这个包在新版的buster中才有,scratch中是没有的……
肝的太晚了实在懒得解决了……有知道的仁人志士麻烦邮箱我一下解决方案Orz。