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

1️⃣ 在树莓派中安装opencv库

(1)安装依赖

如果执行某条指令时出现依赖包问题,建议使用sudo aptitude install(需要先sudo apt-get install aptitude安装aptitude)

#更新和升级任何现有软件包
$ sudo apt-get update && sudo apt-get upgrade
#安装一些开发人员工具,包括CMake,它可以帮助配置OpenCV构建过程:
$ sudo apt-get install build-essential cmake pkg-config
#安装一些映像I/O包,以允许从磁盘加载各种映像文件格式。此类文件格式的示例包括JPEG,PNG,TIFF等
$ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
#安装视频I/O包,能够从磁盘读取各种视频文件格式,以及直接使用视频流
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
$ sudo apt-get install libxvidcore-dev libx264-dev
#GTK用于在屏幕上显示图像并构建基本的GUI
$ sudo apt-get install libgtk2.0-dev libgtk-3-dev
#性能优化包
$ sudo apt-get install libatlas-base-dev gfortran
#安装Python 2.7和Python 3
$ sudo apt-get install python2.7-dev python3-dev

(2)下载OpenCV源码

cd ~
$ wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.3.0.zip
$ unzip opencv.zip
$ wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.3.0.zip
$ unzip opencv_contrib.zip

(3)安装pip

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



(4)安装Python虚拟机

pip安装时,使用国内源加速-i https://mirrors.aliyun.com/pypi/simple

#安装虚拟环境,防止依赖冲突
sudo pip install virtualenv virtualenvwrapper -i https://mirrors.aliyun.com/pypi/simple
sudo rm -rf ~/.cache/pip



配置~/.profile时,需要添加新的环境变量,否则会出现如下错误

export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv # 这条不可缺少
source /usr/local/bin/virtualenvwrapper.sh
export VIRTUALENVWRAPPER_ENV_BIN_DIR=bin # 这条可忽略

加载配置文件,使之生效

# 每次新开终端,要进入python虚拟机都需要事先加载配置文件
source ~/.profile

使用Python3 安装虚拟机

mkvirtualenv cv -p python3

进入虚拟机

source ~/.profile
$ workon cv

安装numpy

由于pip默认从官网上下载第三方库,限于网速问题,多次pip install numpy失败(换源无效),无奈之下只好先在本机上手动下载numpy的.whl文件,通过ssh传输到树莓派中,再进行离线安装

#https://www.piwheels.org/simple/numpy/numpy-1.18.4-cp37-cp37m-linux_armv7l.whl (10.4 MB)
#在Window系统下命令行中输入如下
scp <localfile> pi@192.168.1.9:/home/pi/
$ 输入密码 <password>

将接收到的.whl文件存放到python的site-packages下,然后使用如下指令进行安装

python -m pip install <文件名>

成功安装Numpy

(5)编译OpenCV

# 设置CMake构建选项
cd ~/opencv-3.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-3.3.0/modules \
    -D BUILD_EXAMPLES=ON ..

检查numpy的安装

增大了交换空间CONF_SWAPSIZE=1024

# CONF_SWAPSIZE由100改为1024
sudo nano /etc/dphys-swapfile

# 重启swap服务
sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start

开始编译(这段过程历尽艰辛,各种报错,详情请见编译问题汇总)

make -j4 

安装OpenCV

$ sudo make install
$ sudo ldconfig
$ ls -l /usr/local/lib/python3.7/site-packages/
$ cd ~/.virtualenvs/cv/lib/python3.7/site-packages/
#创建软链
$ ln -s /usr/local/lib/python3.7/site-packages/cv2.cpython-37m-arm-linux-gnueabihf.so cv2

(6)验证安装

$ source ~/.profile 
$ workon cv
$ python
>>> import cv2
>>> cv2.__version__
'3.3.0'
>>>

2️⃣使用opencv和python控制树莓派的摄像头

(1)picamera模块安装

开启虚拟机

$ source ~/.profile #每次开启虚拟机之前都需要source配置文件,否则无法开启
$ workon cv

安装picamera

$ pip install "picamera[array]"

(2)在Python代码中导入OpenCV控制摄像头

拍照功能代码test_image.py:

# import the necessary packages
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2
 
# initialize the camera and grab a reference to the raw camera capture
camera = PiCamera()
rawCapture = PiRGBArray(camera)
 
# allow the camera to warmup
time.sleep(3) #此处把0.1改成了3
 
# 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)

拍照:

摄像功能代码video_test.py:

from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2
camera = PiCamera()
camera.resolution = (640, 480)
camera.framerate = 32
rawCapture = PiRGBArray(camera, size=(640, 480))
time.sleep(0.1)
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)
    if key == ord("q"):
        break

摄像:

3️⃣Raspberry Pi 的人脸识别

注:所有操作均在python虚拟机中进行

安装dlib以及实现人脸识别功能的开源模块face_recogniztion

$ pip install dlib
$ pip install face_recognition

运行GitHub上face_recognition仓库下的代码

运行时需要将摄像头对准图像或照片,尽量离得近一点,识别成功率更高

同一个代码仓库下的另一个示例

该示例引入opencv来处理图像信息,可以实时显示当前摄像头识别到的人脸信息

4️⃣ 结合微服务的进阶任务

docker安装(参考树莓派上 Docker 的安装和使用

sudo apt install docker-ce

拉取已配置python环境和opencv的镜像(支持arm)sixsq/opencv-python

#配置docker的镜像加速
sudo nano /etc/docker/daemon.json
#重新加载docker服务的配置文件
systemctl dameon-reload
#重启docker 服务
systemctl restart docker
#拉取镜像
sudo docker pull sixsq/opencv-python


进入容器并安装库

sudo docker run -it sixsq/opencv-python /bin/bash
pip install "picamera[array]" dlib face_recognition

安装成功后进行commit

sudo docker commit 79e08fabc3fd face_opencv
sudo docker images

建立raspberrypi文件夹及相关文件

  • Dockerfile
FROM face_opencv
RUN mkdir /myapp
WORKDIR /myapp
COPY myapp .

build镜像

sudo docker build -t myface_opencv .

在容器中跑通示例代码facerec_on_raspberry_pi.py

一定要确保摄像头开启,检查是否存在video0文件

sudo docker run -it --device=/dev/vchiq --device=/dev/video0 --name myface_opencv myface_opencv
python3 facerec_on_raspberry_pi.py

(选做)在容器中跑通示例代码facerec_from_webcam_faster.py

#sudo apt-get install x11-xserver-utils
xhost +
sudo docker run -it --rm \
	-v /tmp/.X11-unix:/tmp/.X11-unix \
	-e DISPLAY=:0.0 \
	-e QT_X11_NO_MITSHM=1 \
  	--device=/dev/vchiq \
	--device=/dev/video0 \
	--name myface4 \
	myface_opencv \
	python3 facerec_from_webcam_faster.py



5️⃣问题与总结

  • 问题1-安装依赖

    • 问题描述:出现需要安装依赖和依赖冲突

    • 解决方法:使用sudo aptitude install

  • 问题2-安装pip

    • 问题描述:安装python3 get-pip.py时报错误AttributeError: module 're' has no attribute 'compile'

    • 问题解析:上次实验残留re.py文件,和系统库同名

    • 解决方法:删除re.py文件

  • 问题3-安装Pyhton虚拟机

    • 问题描述:使用Python3 安装虚拟机报错

    • 解决方法:修改配置文件如博客上文所示

  • 问题4-编译OpenCV

    • 问题描述:编译时出现四次缺少hpp类的错误

    • 问题解析:出错是由于hpp文件不存在,但其文件存在于opencv-contrib目录下,可以在代码中将其路径修改为文件所在目录对应的绝对路径。

    • 解决方法:根据错误信息提示的文件目录,找到配置文件,将配置信息修改

    • 前两个报错

    • #include "opencv2/xfeatures2d/cuda.hpp"

    • 改为

    • #include "/home/pi/opencv_contrib-3.3.0/modules/xfeatures2d/include/opencv2/xfeatures2d/cuda.hpp"

    • 第三个报错

    • opencv2/xfeatures2d.hpp

    • 改为

    • /home/pi/opencv_contrib-3.3.0/modules/xfeatures2d/include/opencv2/xfeatures2d.hpp

    • 第四个报错

    • /opencv2/xfeatures2d/nonfree.hpp

    • 改为

    • include "/home/pi/opencv_contrib-3.3.0/modules/xfeatures2d/include/opencv2/xfeatures2d/nonfree.hpp"

  • 问题5

    • 问题描述:无效类型转换

    • 解决方法:打开代码文件/home/pi/opencv-3.3.0/modules/python/src2/cv2.cpp在对应行进行强制类型转换

  • 问题6

    • 问题描述:运行拍照功能代码时出错,缺少gtk库

    • 解决方法:

      • 首先下载缺少的库libgtk2.0-dev和pkg-config,使用aptitude install下载该库及相关依赖,然后使用cmake重新编译OpenCv

      • 在cmake时要添加如下内容:-D WITH_QT=ON -D WITH_GTK=ON -D WITH_GTK_2_X=ON(参考链接OpenCV Error: The function is not implemented.解决方法

      • 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.3.0/modules \
            -D BUILD_EXAMPLES=ON \
            -D WITH_QT=ON \
            -D WITH_GTK=ON \
            -D WITH_GTK_2_X=ON ..
        
      • 如果cmake过程中出现如下错误,说明系统缺少Qt 4.x模块,需要使用pip安装Qt 4:sudo apt-get install qt4-default

      • 使用命令sudo apt search qt4-default,出现以下内容说明安装成功

      • 使用make -j4重新编译安装opencv(又是一段漫长的等待,建议睡个觉再继续嗷)

6️⃣小组协作记录

小组成员及分工

学号 姓名 分工
031702311 陈珊珊 负责实际操作,问题解决,博客撰写
031702321 林鑫灿 负责查阅资料,问题解决,博客撰写
031702336 林家伟 负责查阅资料,问题解决,博客撰写

在线协作记录

我们小组通过屏幕分享的方式直播操作,遇到问题大家一起解决,大概经过16个小时的奋斗我们终于完成了!!!

posted @ 2020-06-06 22:31  也许hhh。  阅读(396)  评论(0编辑  收藏  举报