第7次实践作业
实验前的准备
拓展文件系统
扩展文件系统,以包括microSD卡上的所有空间。具体步骤如下:
1、在树莓派终端(或者SSH)上输入:
$ sudo raspi-config
2、然后选择“高级选项”菜单项
3、然后选择“扩展文件系统”:
4、选择第一个选项“A1.Expand Filesystem”,按键盘上的Enter键,完成后点击“Finish”按钮,重新启动树莓派。
重新启动后,文件系统已经扩展为包括micro-SD卡上的所有空间。可以通过执行 df -h
检查输出来验证磁盘是否已扩展。
5、此时我的树莓派文件系统已扩展为包含16GB的micor-SD卡可以删除LibreOffice和Wolfram引擎以释放Pi上的一些空间:
$ sudo apt-get purge wolfram-engine
$ sudo apt-get purge libreoffice*
$ sudo apt-get clean
$ sudo apt-get autoremove
换源
可以将更换树莓派源为清华镜像源,参考:更换清华/中国科技大学镜像系统
在树莓派中安装opencv库
安装依赖
# 1、更新系统
$ sudo apt-get update && sudo apt-get upgrade
# 2、在树莓派上安装OpenCV所需要依赖的工具和一些图像视频库
# 3、安装包括CMake的开发人员工具
# 安装build-essential、cmake、git和pkg-config
$ sudo apt-get install build-essential cmake git pkg-config
# 4、安装常用图像工具包:tif格式图像工具包、JPEG-2000图像工具包、png图像工具包
$ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
# 5、安装常用的视频库
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
$ sudo apt-get install libxvidcore-dev libx264-dev
# 6、安装GTK
$ sudo apt-get install libgtk2.0-dev libgtk-3-dev
# 7、安装OpenCV数值优化函数包
$ sudo apt-get install libatlas-base-dev gfortran
# 8、安装 Python2.7 & Python3,一般自带
$ sudo apt-get install python2.7-dev python3-dev
下载并编译OpenCV源码
下载opencv4.3.0和opencv_contrib4.3.0
# 下载OpenCV
$ wget -O opencv-4.3.0.zip https://codeload.github.com/opencv/opencv/zip/4.3.0
# 下载OpenCV_contrib库
$ wget -O opencv_contrib-4.3.0.zip https://codeload.github.com/opencv/opencv_contrib/zip/4.3.0
解压opencv4.3.0和opencv_contrib4.3.0
$ unzip opencv-4.3.0.zip
$ unzip opencv_contrib-4.3.0.zip
正确解压opencv4.3.0:
正确解压opencv_contrib-4.3.0.zip:
编译源码前的准备
安装pip
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py
$ sudo python3 get-pip.py
Python虚拟环境安装(不安装也是可以的),它通过为每个项目创建隔离的、独立的Python环境,将不同项目所需的依赖项保存在不同的位置,以解决依赖冲突:
$ sudo pip install virtualenv virtualenvwrapper
$ sudo rm -rf ~/.cache/pip
为Python虚拟环境配置环境变量:
# 配置virtualenv 和 virtualenvwrapper 的环境变量
$ echo -e "
# 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
# 刷新环境变量
$ source ~/.profile
创建Python3虚拟环境
$ mkvirtualenv cv -p python3
# 进入Python虚拟环境
$ workon cv
安装 Numpy(在Python虚拟环境中),过程很耗时:
$ pip install numpy
编译并安装OpenCV
$ cd ~/opencv-4.3.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.3.0/modules
-D BUILD_EXAMPLES=ON ..
tips:
- CMAKE_BUILD_TYPE是编译方式
- CMAKE_INSTALL_PREFIX是安装目录
- OPENCV_EXTRA_MODULES_PATH是加载额外模块
- INSTALL_PYTHON_EXAMPLES是安装官方python例程
- BUILD_EXAMPLES是编译例程(这两个可以不加,不加编译稍微快一点点,想要C语言的例程的话,在最后一行前加参数INSTALL_C_EXAMPLES=ON,要C++例程的话在最后一行前加参数INSTALL_C_EXAMPLES=ONINSTALL_CXX_EXAMPLES=ON)
增加交换空间的大小。
这使得OpenCV能够编译树莓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
...
为了激活新的交换空间,重新启动该服务:
$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start
最后,终于到了编译OpenCV的时候了,使用make -j4
命令对OpenCV进行编译,这个阶段很费时。
编译完成后,就可以安装OpenCV了。使用如下命令进行安装OpenCV:
$ sudo make install
$ sudo ldconfig
更名:
$ cd /usr/local/lib/python3.7/site-packages/
$ sudo mv cv2.cpython-35m-arm-linux-gnueabihf.so cv2.so
然后进入Python3的shell进行验证:
出现版本信息即为成功安装OpenCV库。
使用opencv和python控制树莓派的摄像头
首先安装picamera
:
$ pip install "picamera[array]"
使用示例程序进行拍照,python代码如下:
# 导入必要的依赖包
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2
# 初始化摄像头
camera = PiCamera()
rawCapture = PiRGBArray(camera)
# 调整感光时间
time.sleep(5)
# grab an image from the camera
camera.capture(rawCapture, format="bgr")
image = rawCapture.array
# display the image on screen and wait for a keypress
cv2.imshow("Image", image)
cv2.waitKey(0)
结果如下图所示:
使用示例程序进行视频流传输:
# 导入依赖
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2
# 初始化摄像头
camera = PiCamera()
camera.resolution = (1024, 720)
camera.framerate = 32
rawCapture = PiRGBArray(camera, size=(1024, 720))
# 感光时间
time.sleep(5)
for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
image = frame.array
cv2.imshow("Frame", image)
key = cv2.waitKey(1) & 0xFF
# 清空
rawCapture.truncate(0)
# 输入q退出
if key == ord("q"):
break
使用UFO测试一下摄像头的帧率:
从实际观感上看,视频流帧率大概为30帧每秒。
利用树莓派的摄像头实现人脸识别
首先需要安装必要的依赖:
$ pip install dlib face_recognition numpy
创建一个facerec_on_raspberry_pi.py
文件、输入代码(我使用的是Donald Trump的照片进行学习),然后运行它。注意需要在代码同目录下放置用于学习的图片。
接下来安装webcam并创建facerec_from_webcam_faster.py
文件、输入代码,并运行它。
$ sudo apt-get install fswebcam
$ python3 facerec_from_webcam_faster.py
使用以下两张图片进行学习:
并对一张图片进行识别:
可见,正确识别出两人。
结合微服务的进阶任务
在opencv的docker容器中跑facerec_on_raspberry_pi.py
首先在树莓派上安装docker,可以使用以下两步进行脚本安装:
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sh get-docker.sh --mirror Aliyun
将当前用户加入到docker组就能够在使用docker命令时不需要加sudo
了:
$ sudo usermod -aG docker pi
由于OpenCV安装过于复杂且费时,使用OpenCV容器可以直接省去了安装步骤。拉取如下镜像:
$ docker pull sixsq/opencv-python
基于以上镜像,更新pip
以及pip3
,并安装picamera[array]
、dlib
和face_recognition
,并设置启动时执行的命令:ENTRYPOINT["python3"]。完整dockerfile文件如下:
FROM sixsq/opencv-python
RUN mkdir ~/.pip && mkdir -p /usr/local/faceRe && chmod -R 777 /usr/local/faceRe
COPY pip.conf ~/.pip/
RUN pip3 install --upgrade pip && pip install --upgrade pip
&& pip3 install "picamera[array]"
&& pip3 install dlib
&& pip3 install face_recognition
WORKDIR /usr/local/faceRe
ENTRYPOINT [ "python3" ]
RUN apt-get update && apt install x11-xserver-utils
成功创建镜像后,使用如下命令启动容器:
$ docker run -it --rm -v [本地代码目录]:[容器工作目录] --device=/dev/vchiq --device=/dev/video0 [镜像名] [人脸识别python代码]
实例:
$ docker run -it --rm -v /usr/local/faceRe:/usr/local/faceRe --device=/dev/vchiq --device=/dev/video0 opencvenv facerec_on_raspberry_pi.py
同样地,程序运行正确。
选做:在opencv的docker容器中跑facerec_from_webcam_faster.py
因为需要使用X11服务,所以在上面的Dockerfile中还需要添加一句RUN apt-get update && apt install x11-xserver-utils -y
再构建新的镜像。
$ docker build -t opencvenv:v2 .
使用如下命令启动容器。
$ xhost +
$ sudo docker run -it --rm
-v /usr/local/faceRe:/usr/local/faceRe
-v /tmp/.X11-unix:/tmp/.X11-unix
-e DISPLAY=$DISPLAY
-e QT_X11_NO_MITSHM=1
--device=/dev/vchiq
--device=/dev/video0
opencvenv:v2
facerec_from_webcam_faster.py
成功运行程序后,会弹出Video窗口:
成功识别。微服务作业文件结构为:
问题与解决办法
问题1:Python 3虚拟环境启动失败。
解决:按如下代码配置环境变量。
$ echo "export WORKON_HOME=$HOME/.virtualenvs" >> ~/.profile
$ echo "export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3" >> ~/.profile
$ echo "export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv" >> ~/.profile
$ echo "source /usr/local/bin/virtualenvwrapper.sh" >> ~/.profile
$ echo "export VIRTUALENVWRAPPER_ENV_BIN_DIR=bin" >> ~/.profile
问题2:hpp文件缺失情况。
解答:这些是头文件出现问题,可以把下面文件夹里的两个文件拷贝到/home/pi/opencv_contrib-4.3.0/modules/xfeatures2d/test
,然后打开这个文件,修改下头文件。
接下来出现的同类问题,可以采取同样的解决方法。
小组协作
1、小组使用腾讯会议进行语音交流,组长使用共享屏幕的方式向组员展示树莓派情况,图中显示为实验到达编译OpenCV的阶段。
2、组员查询问题的解决方法,由拥有树莓派的组长进行实际操作。
3、第一天共协作5小时,实验进度到达微服务
。
4、第二天共花时4小时进行微服务实验。
整个实验过程共花费11.5个小时左右。
小组分工
组员 | 工作 |
---|---|
111701205-陈志明 | 操作树莓派,解决实际问题,编写博客,错误总结 |
081700104-高鹏 | 调查资料,查找问题解决办法 |
031702644-钟博 | 调查资料,提供实验素材 |
参考资料:
Raspbian Stretch: Install OpenCV 3 + Python on your Raspberry Pi
ERROR: Environment '/home/pi/.virtualenvs/cv' does not contain an activate script
编译OpenCV提示opencv_contrib缺少boostdesc_bgm.i等文件
树莓派4的opencv4.1.0--python3.7的开发环境安装