2020系统综合实践 第7次实践作业 21组

组长博客传送门

第7次实践作业

实验前的准备

拓展文件系统

扩展文件系统,以包括microSD卡上的所有空间。具体步骤如下:

1、在树莓派终端(或者SSH)上输入:

$ sudo raspi-config

2、然后选择“高级选项”菜单项

img

3、然后选择“扩展文件系统”:

img

4、选择第一个选项“A1.Expand Filesystem”,按键盘上的Enter键,完成后点击“Finish”按钮,重新启动树莓派。

重新启动后,文件系统已经扩展为包括micro-SD卡上的所有空间。可以通过执行 df -h 检查输出来验证磁盘是否已扩展。

img

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:

img

正确解压opencv_contrib-4.3.0.zip:

img

编译源码前的准备

安装pip

$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py
$ sudo python3 get-pip.py

img

Python虚拟环境安装(不安装也是可以的),它通过为每个项目创建隔离的、独立的Python环境,将不同项目所需的依赖项保存在不同的位置,以解决依赖冲突:

$ sudo pip install virtualenv virtualenvwrapper
$ sudo rm -rf ~/.cache/pip

img

为Python虚拟环境配置环境变量

# 配置virtualenv 和 virtualenvwrapper 的环境变量
$ echo -e "\n# 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

img

创建Python3虚拟环境

$ mkvirtualenv cv -p python3
# 进入Python虚拟环境
$ workon cv

安装 Numpy(在Python虚拟环境中),过程很耗时:

$ pip install numpy

img

编译并安装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)

img

增加交换空间的大小

这使得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进行编译,这个阶段很费时。

img

编译完成后,就可以安装OpenCV了。使用如下命令进行安装OpenCV:

$ sudo make install
$ sudo ldconfig

img

更名:

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

然后进入Python3的shell进行验证:

img

出现版本信息即为成功安装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)

结果如下图所示:

img

使用示例程序进行视频流传输:

# 导入依赖
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测试一下摄像头的帧率:

img

从实际观感上看,视频流帧率大概为30帧每秒。

利用树莓派的摄像头实现人脸识别

首先需要安装必要的依赖:

$ pip install dlib face_recognition numpy

创建一个facerec_on_raspberry_pi.py文件、输入代码(我使用的是Donald Trump的照片进行学习),然后运行它。注意需要在代码同目录下放置用于学习的图片。

img

img

接下来安装webcam并创建facerec_from_webcam_faster.py文件、输入代码,并运行它。

$ sudo apt-get install fswebcam
$ python3 facerec_from_webcam_faster.py

使用以下两张图片进行学习:

img

并对一张图片进行识别:

img

可见,正确识别出两人。

结合微服务的进阶任务

在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]dlibface_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

img

成功创建镜像后,使用如下命令启动容器:

$ 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

img

同样地,程序运行正确。

选做:在opencv的docker容器中跑facerec_from_webcam_faster.py

因为需要使用X11服务,所以在上面的Dockerfile中还需要添加一句RUN apt-get update && apt install x11-xserver-utils -y再构建新的镜像。

$ docker build -t opencvenv:v2 .

img

使用如下命令启动容器。

$ 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窗口:

img

成功识别。微服务作业文件结构为:

img

问题与解决办法

问题1:Python 3虚拟环境启动失败。

img

解决:按如下代码配置环境变量。

$ 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文件缺失情况。

img

解答:这些是头文件出现问题,可以把下面文件夹里的两个文件拷贝到/home/pi/opencv_contrib-4.3.0/modules/xfeatures2d/test,然后打开这个文件,修改下头文件。

img

img

接下来出现的同类问题,可以采取同样的解决方法。

小组协作

1、小组使用腾讯会议进行语音交流,组长使用共享屏幕的方式向组员展示树莓派情况,图中显示为实验到达编译OpenCV的阶段。

img

2、组员查询问题的解决方法,由拥有树莓派的组长进行实际操作。

img

img

3、第一天共协作5小时,实验进度到达微服务

img

小组分工

组员 工作
111701205-陈志明 操作树莓派,解决实际问题,编写博客,错误总结
081700104-高鹏 调查资料,查找问题解决办法
031702644-钟博 调查资料,提供实验素材

参考资料:

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

树莓派3B/3B+和4B安装OpenCV教程

更换清华/中国科技大学镜像系统

ERROR: Environment '/home/pi/.virtualenvs/cv' does not contain an activate script

编译OpenCV提示opencv_contrib缺少boostdesc_bgm.i等文件

树莓派4的opencv4.1.0--python3.7的开发环境安装

Accessing the Raspberry Pi Camera with OpenCV and Python

树莓派实现简单的人脸识别

Raspberry Pi 4B 使用OpenCV访问摄像头picamera模块

posted @ 2020-06-07 22:48  kingbob  阅读(236)  评论(0编辑  收藏  举报