2020系统综合实践 第7次实践作业 2组
1. 在树莓派中安装opencv库
- 参考教程:关于opencv的编译安装,可以参考Adrian Rosebrock的Raspbian Stretch: Install OpenCV 3 + Python on your Raspberry Pi。
1.1 安装依赖
# 更新软件源,更新软件
sudo apt-get update && sudo apt-get upgrade
# Cmake等开发者工具
sudo apt-get install build-essential cmake pkg-config
# 图片I/O包
sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
# 视频I/O包
sudo aptitude install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo aptitude install libxvidcore-dev libx264-dev
# OpenCV用于显示图片的子模块需要GTK
sudo aptitude install libgtk2.0-dev libgtk-3-dev
# 性能优化包
sudo aptitude install libatlas-base-dev gfortran
# 安装 Python2.7 & Python3
sudo aptitude install python2.7-dev python3-dev
1.2 下载OpenCV源码
cd ~
wget -O opencv.zip https://github.com/Itseez/opencv/archive/4.1.2.zip
unzip opencv.zip
wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/4.1.2.zip
unzip opencv_contrib.zip
PS:官方 opencv 与 opencv/opencv_contrib (版本号需要一致,下载速度慢)
1.3 安装pip
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
sudo python3 get-pip.py
1.4 安装Python虚拟机,防止依赖冲突
sudo pip install virtualenv virtualenvwrapper
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
# 每次新开终端,需要虚拟环境时都要运行
source ~/.profile
# 使用python3创建虚拟环境cv
mkvirtualenv cv -p python3
# 进入虚拟机
source ~/.profile && workon cv
# 安装numpy
pip install numpy
(进入虚拟机后可以看到前面有cv虚拟机的标识)
1.5 编译OpenCV
PS:要确保已经进入了cv虚拟环境,命令提示符开头有(cv)。
cd ~/opencv-4.1.2/
mkdir build
cd build
# 设置CMake构建选项
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.1.2/modules \
-D BUILD_EXAMPLES=ON
#为了避免编译时内存不足导致的CPU挂起,调整swap交换文件大小:
# 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
1.6 安装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 cv2
PS:Linux ln命令是一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。
当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。
语法: ln [参数][源文件或目录][目标文件或目录]
1.7 验证OpenCV的安装
$ source ~/.profile
$ workon cv
$ python
>>> import cv2
>>> cv2.__version__
'4.1.2'
>>>
退出python虚拟机命令deactivate
2. 使用opencv和python控制树莓派的摄像头
- 参考教程:还是可以参考Adrian Rosebrock的Accessing the Raspberry Pi Camera with OpenCV and Python
2.1 拍照测试
#测试树莓派相机模块
raspistill -o output.jpg
2.2 安装picamera(虚拟机环境下)
source ~/.profile
workon cv
pip install "picamera[array]"
2.3 创建python文件
nano test_image.py
python 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(1)
# 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)
3. 利用树莓派的摄像头实现人脸识别
-
人脸识别有开源的python库face_recognition,这当中有很多示例代码
-
参考教程:树莓派实现简单的人脸识别
-
要求:跑通face_recognition的示例代码facerec_on_raspberry_pi.py以及facerec_from_webcam_faster.py
3.1 安装所需库
pip install dlib face_recognition numpy
3.2 运行facerec_on_raspberry_pi.py代码
3.3 运行facerec_from_webcam_faster.py代码
4. 结合微服务的进阶任务
-
使用微服务,部署opencv的docker容器(要能够支持arm),并在opencv的docker容器中跑通(3)的示例代码facerec_on_raspberry_pi.py
-
选做:在opencv的docker容器中跑通步骤(3)的示例代码facerec_from_webcam_faster.py
4.1 准备环境
#退出python虚拟机
deactivate
#下载安装脚本
curl -fsSL https://get.docker.com -o get-docker.sh
#运行安装脚本(阿里云镜像)
sh get-docker.sh --mirror Aliyun
#验证docker版本
sudo docker --version
#填加用户到docker组
sudo usermod -aG docker pi
#重新登陆以用户组生效
exit && ssh pi@raspiberry
(重启之后,docker指令之前就不需要加sudo了
#拉取arm可用的docker镜像
docker pull sixsq/opencv-python
#进入容器并安装所需库
docker run -it [imageid] /bin/bash
这里docker run -it sixsq/opencv-python /bin/bash
pip install "picamera[array]" dlib face_recognition
#commit镜像
docker commit [containerid] myopencv
这里docker commit d24 myopencv
自定义镜像Dockerfile:
FROM my-opencv
MAINTAINER GROUP02
RUN mkdir /myapp
WORKDIR /myapp
ENTRYPOINT ["python3"]
#生成镜像
docker build -t myopencv-test .
#运行脚本
docker run -it --rm --name my-running-py -v ${PWD}/workdir:/myapp --device=/dev/vchiq --device=/dev/video0 myopencv-test facerec_on_raspberry_pi.py
4.2 选做:在opencv的docker容器中跑通步骤(3)的示例代码facerec_from_webcam_faster.py
4.2.1 环境准备
安装好后,先打开Xming,然后打开Putty,开启树莓派的ssh配置中的X11
打开Putty后,把树莓派的IP地址填在下面这一栏里,端口用默认的就行了
查看DISPLAY环境变量值
printenv
PS:这个查看是在用Putty打开的窗口上查看到的,若直接在树莓派里的终端看,看到就是"DISPLAY=localhost:0.0"
检测ssh配置文件中X11是否开启 cat /etc/ssh/sshd_config
在用Putty打开的窗口上编写run.sh(路径在树莓派中的docker1文件夹
xhost + #允许来自任何主机的连接
docker run -it \
--rm \
-v ${PWD}/workdir:/myapp \
--net=host \
-v $HOME/.Xauthority:/root/.Xauthority \
-e DISPLAY=:10.0 \ #此处填写上面查看到的变量值
-e QT_X11_NO_MITSHM=1 \
--device=/dev/vchiq \
--device=/dev/video0 \
--name facerecgui2 \
myopencv-test \
facerec_from_webcam_faster.py
5. 以小组为单位,发表一篇博客,记录遇到的问题和解决方法,提供小组成员名单以及在线协作的图片
5.1 问题与解决方法
问题一:
解决方法:
法一:后面会出现各种问题,这个方法可能不行!
sudo apt-get install aptitude
sudo aptitude install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
法二:软件源的问题,源中的版本比较低;依赖的版本号比正要安装的版本号要低导致没法安装。
只需要将原来软件源删除,用新的软件源替换一下就可以了。
sudo gedit /etc/apt/sources.list //查看源中的软件包列表
写上软件源后,再刷新一下,注意一定要刷新,运行:
sudo apt-get update
sudo apt-get uograde
问题二:使用python3创建虚拟环境cv时
解决方法:配置文件改成这样的
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
问题三:make -j4编译时出现错误。安装OpenCV时提示缺少boostdesc_bgm.i文件。
解决办法:把下载后拷贝到目录opencv_contrib/modules/xfeatures2d/src/下即可
https://files.cnblogs.com/files/arxive/boostdesc_bgm.i%2Cvgg_generated_48.i%E7%AD%89.rar
PS:为了传输代码和截图等文件,开启FTP
sudo apt-get install vsftpd # 安装vsftpd
sudo service vsftpd start # 启动服务
sudo nano /etc/vsftpd.conf # 改write_enable=YES
sudo service vsftpd restart # 重启服务
问题四:fatal error: features2d/test/test_detectors_regression.impl.hpp: 没有那个文件或目录,
解决办法:
fatal error: features2d/test/test_detectors_regression.impl.hpp: 没有那个文件或目录,头文件include地址不对。
将opencv-4.1.0/modules/features2d/test/文件下的
test_descriptors_regression.impl.hpp
test_detectors_regression.impl.hpp
test/test_detectors_invariance.impl.hpp
test_descriptors_invariance.impl.hpp
test_invariance_utils.hpp
拷贝到opencv_contrib-4.1.0/modules/xfeatures2d/test/文件下。
同时将
opencv_contrib-4.1.0/modules/xfeatures2d/test/test_features2d.cpp文件下的
#include "features2d/test/test_detectors_regression.impl.hpp"
#include "features2d/test/test_descriptors_regression.impl.hpp"
改成:
#include "test_detectors_regression.impl.hpp"
#include "test_descriptors_regression.impl.hpp"
opencv_contrib-4.1.0/modules/xfeatures2d/test/test_rotation_and_scale_invariance.cpp文件下的
将
#include "features2d/test/test_detectors_invariance.impl.hpp"
#include "features2d/test/test_descriptors_invariance.impl.hpp"
改成:
#include "test_detectors_invariance.impl.hpp"
#include "test_descriptors_invariance.impl.hpp"
还有很多这样的错误……………………一样的改
问题五:OpenCV Error: Unspecified error (The function is not implemented...
未解决:
下依赖重新编译
sudo apt-get install aptitude
sudo aptitude install libgtk2.0-dev #安装libgtk2.0-dev
//查看是否已安装gtk2.0
sudo aptitude search libgtk2.0-dev
重新回到1.5执行命令,执行make -j4时出现问题七
问题六:再次make -j4编译的时候又出现错误
未解决:
sudo aptitude install qt5-default后一直到make -j4继续执行。
最后解决办法:重新烧录系统
5.2 小组成员名单、组员的分工和各自贡献
学号 | 姓名 | 分工 | 贡献 |
---|---|---|---|
031702504 | 林睿 | 实际操作,查资料 | 40% |
031702507 | 黄皓 | 查资料 | 30% |
031702508 | 石晓楠 | 查资料 | 30% |
5.3 在线协作图片
5.4 参考链接
https://blog.csdn.net/fsz520w/article/details/82153156
https://www.cnblogs.com/zaynq/p/12996274.html
http://www.luyixian.cn/news_show_316237.aspx