在树莓派上安装Python3+OpenCV3
最近给树莓派买了一些传感器,感觉能做的事更多了,那就先抄一个机器视觉的玩具练练手吧~当然,怎么能少了OpenCV呢[奸笑]
参考:Raspbian Stretch: Install OpenCV 3 + Python on your Raspberry Pi
1 扩展存储卡空间
运行树莓派配置sudo raspi-config
,选择”Advanced Options”,选择”Expand filesystem”,按提示重启。
使用df -h
检查存储空间。
当然,如果空间仍然不够用,可以删点东西:
1 | sudo apt-get purge wolfram-engine |
2 安装依赖
2.1 更新系统
当然,安装依赖前先将系统更新至最新:
1 | sudo apt-get update && time sudo apt-get upgrade && time sudo apt-get dist-upgrade |
2.2 安装编译/开发工具
安装包括cmake
在内的开发工具,帮助我们配置并编译opencv
:
1 | sudo apt-get install build-essential cmake pkg-config |
2.3 图片相关依赖
安装图片I/O相关包,包括常见的JPEG、PNG、TIFF等:
1 | sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev |
2.4 视频相关依赖
安装读取视频、处理视频流的相关依赖:
1 | sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev |
2.5 highgui
相关依赖
安装OpenCV时会附带一个叫做highgui
的子模块,该模块使用GUI界面显示图片,要使得该模块能够正常编译,需要安装:
1 | sudo apt-get install libgtk2.0-dev libgtk-3-dev |
2.6 优化相关依赖
通过安装一些依赖可以优化OpenCV内部的矩阵运算过程,这些优化依赖对像树莓派这样计算资源受限的设备来说尤为重要:
1 | sudo apt-get install libatlas-base-dev gfortran |
2.7 Python头文件
为了通过Python使用OpenCV库,在编译时需要Python头文件等资源:
1 | sudo apt-get install python2.7-dev python3-dev |
3 下载OpenCV源码
3.1 OpenCV
我们从OpenCV官网下载最新版源码(版本3.4.3),该版本带有深度神经网络模块,推荐从本机下载并上传树莓派,因为本机迅雷下器比较快🤦:
1 | scp ./Downloads/cv_3.4.3.zip pi@192.168.1.108:./ |
3.2 OpenCV高级功能
我们希望能够使用OpenCV的所有功能(包括如SIFT、SURF在内的高级功能),需要下载相应版本的opencv_contrib:
1 | scp ./Downloads/cv_c_3.4.3.zip pi@192.168.1.108:./ |
4 Python版本控制
我习惯使用conda
,因此下了个berryconda,上传树莓派(还是因为迅雷更快🤦):
1 | scp ./Downloads/Berryconda3-2.0.0-Linux-armv7l.sh pi@192.168.1.108:./ |
并安装:
1 | chmod +x Berryconda3-2.0.0-Linux-armv7l.sh |
安装完成之后更新conda
:
1 | conda update --all |
新建名叫cv
的环境:
1 | conda create -n cv python=3.5.3 |
激活环境:
1 | source activate cv |
安装Numpy,需要比较长的时间:
1 | conda install numpy |
关于原文使用pip
而这里使用conda
的参考原因(编译选项问题导致conda安装的Python与pip安装的Numpy不兼容)。
5 其他软件包
因为个人爱好和习惯,我又安装了TensorFlow以及tesseract:
1 | sudo apt install libatlas-base-dev |
6 构建
6.1 解压并构建
1 | cd ~/opencv-3.4.3/ |
6.2 检查构建输出
务必检查CMake构建输出中Python解释器/库等信息,正常构建完成的信息应包含类似:
1 | -- Python 3: |
6.3 修改SWAP配置
在开始编译前,先调整一下虚拟内存大小,使得编译过程能够利用树莓派的全部四颗核心,避免编译过程因为内存不足而挂起:
1 | sudo vim /etc/dphys-swapfile |
再重启虚拟内存服务:
1 | sudo /etc/init.d/dphys-swapfile stop |
注意:在完成所有编译、安装,且试验成功后,记得吧虚拟内存改回去,否则据说容易烧卡。
7 编译
终于可以开始编译了,大约需要一个半小时:
1 | make -j4 |
编译时树莓派会启用全部四颗核心,因此强烈建议开启散热风扇,编译时的top
CPU利用率:
8 安装
将编译完成的OpenCV安装在系统中:
1 | sudo make install |
此时OpenCV及Python支持已经安装再/usr/local/lib/python3.5/site-packages
目录下了:
1 | ls -l /usr/local/lib/python3.5/site-packages/ |
出于某种原因,编译完成的的.so
文件叫做cv2.cpython-35m-arm-linux-gnueabihf.so
,我们需要将其重命名:
1 | cd /usr/local/lib/python3.5/site-packages/ |
之后再将其链接在conda的cv
环境中:
1 | cd ~/berryconda3/envs/cv/lib/python3.5/site-packages/ |
9 测试
在cv
环境中测试:
1 | source activate cv |
10 一些问题
一开始我使用python 3.6.6:
1 | conda create -n cv python=3.6 |
然后编译:
1 | cd ~/opencv-3.4.3/ |
报错:
1 | -- Found PythonInterp: /usr/bin/python2.7 (found suitable version "2.7.13", minimum required is "2.7") |
即树莓派上还没有python3.6-dev,仅有python3.5-dev(即python 3.5.3-0版本),于是我打算用cmake -D
指定,或是export环境变量,发现报错依然存在:
1 | cd ~/opencv-3.4.3/ |
参考CMake cannot find PythonLibs #8174的说明想修改cmake文件也不成功。
通过Debian软件包搜索可知这个包在新版的buster中才有,scratch中是没有的……
肝的太晚了实在懒得解决了……有知道的仁人志士麻烦邮箱我一下解决方案Orz。