在树莓派上安装Python3+OpenCV3

最近给树莓派买了一些传感器,感觉能做的事更多了,那就先抄一个机器视觉的玩具练练手吧~当然,怎么能少了OpenCV呢[奸笑]

参考:Raspbian Stretch: Install OpenCV 3 + Python on your Raspberry Pi

1 扩展存储卡空间

运行树莓派配置sudo raspi-config,选择”Advanced Options”,选择”Expand filesystem”,按提示重启。

使用df -h检查存储空间。

当然,如果空间仍然不够用,可以删点东西:

1
2
3
4
sudo apt-get purge wolfram-engine
sudo apt-get purge libreoffice*
sudo apt-get clean
sudo apt-get autoremove

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
2
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libxvidcore-dev libx264-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
2
scp ./Downloads/cv_3.4.3.zip pi@192.168.1.108:./
unzip cv_3.4.3.zip

3.2 OpenCV高级功能

我们希望能够使用OpenCV的所有功能(包括如SIFT、SURF在内的高级功能),需要下载相应版本的opencv_contrib

1
2
scp ./Downloads/cv_c_3.4.3.zip pi@192.168.1.108:./
unzip cv_c_3.4.3.zip

4 Python版本控制

我习惯使用conda,因此下了个berryconda,上传树莓派(还是因为迅雷更快🤦‍):

1
scp ./Downloads/Berryconda3-2.0.0-Linux-armv7l.sh pi@192.168.1.108:./

并安装:

1
2
chmod +x Berryconda3-2.0.0-Linux-armv7l.sh
./Berryconda3-2.0.0-Linux-armv7l.sh

安装完成之后更新conda

1
conda update --all

新建名叫cv的环境:

1
conda create -n cv python=3.5.3

激活环境:

1
2
3
source activate cv
# 退出环境
#source deactivate

安装Numpy,需要比较长的时间:

1
conda install numpy

关于原文使用pip而这里使用conda的参考原因(编译选项问题导致conda安装的Python与pip安装的Numpy不兼容)。

5 其他软件包

因为个人爱好和习惯,我又安装了TensorFlow以及tesseract:

1
2
3
4
sudo apt install libatlas-base-dev
pip install tensorflow
sudo apt-get install tesseract-ocr
pip install pytesseract

6 构建

6.1 解压并构建

1
2
3
4
5
6
7
8
cd ~/opencv-3.4.3/
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-3.4.3/modules \
-D BUILD_EXAMPLES=ON ..

6.2 检查构建输出

务必检查CMake构建输出中Python解释器/库等信息,正常构建完成的信息应包含类似:

1
2
3
4
5
6
--   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配置

在开始编译前,先调整一下虚拟内存大小,使得编译过程能够利用树莓派的全部四颗核心,避免编译过程因为内存不足而挂起:

1
2
3
4
sudo vim /etc/dphys-swapfile
# dphys-swapfile:
# CONF_SWAPSIZE=100
CONF_SWAPSIZE=1024

再重启虚拟内存服务:

1
2
sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start

注意:在完成所有编译、安装,且试验成功后,记得吧虚拟内存改回去,否则据说容易烧卡。

7 编译

终于可以开始编译了,大约需要一个半小时:

1
make -j4

编译时树莓派会启用全部四颗核心,因此强烈建议开启散热风扇,编译时的top CPU利用率:
编译中的CPU利用率

8 安装

将编译完成的OpenCV安装在系统中:

1
2
sudo make install
sudo ldconfig

此时OpenCV及Python支持已经安装再/usr/local/lib/python3.5/site-packages目录下了:

1
2
3
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,我们需要将其重命名:

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

之后再将其链接在conda的cv环境中:

1
2
cd ~/berryconda3/envs/cv/lib/python3.5/site-packages/
ln -s /usr/local/lib/python3.5/site-packages/cv2.so cv2.so

9 测试

在cv环境中测试:

1
2
3
4
5
6
source activate cv
python
>>> import cv2
>>> cv2.__version__
'3.4.3'
>>>

10 一些问题

一开始我使用python 3.6.6:

1
conda create -n cv python=3.6

然后编译:

1
2
3
4
5
6
7
8
cd ~/opencv-3.4.3/
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-3.4.3/modules \
-D BUILD_EXAMPLES=ON ..

报错:

1
2
3
4
-- 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环境变量,发现报错依然存在:

1
2
3
4
5
6
7
8
9
10
cd ~/opencv-3.4.3/
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-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。

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×