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个小时的奋斗我们终于完成了!!!