第7次实践作业
在树莓派中安装opencv库
参考教程:关于opencv的编译安装,可以参考Adrian Rosebrock的Raspbian Stretch: Install OpenCV 3 + Python on your Raspberry Pi。
步骤1:
1.扩展文件系统后重新启动Pi
2.验证磁盘是否已扩展并检查输出
步骤2:
1.更新和升级任何现有软件包
$ sudo apt-get update && sudo apt-get upgrade
2.安装开发人员工具来可以帮助我们配置OpenCV构建过程
$ sudo apt-get install build-essential cmake pkg-config
3.安装 image I/O packages 以允许我们从磁盘加载各种映像文件格式
$ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
4.安装 video I/O packages 使我们能够从磁盘读取各种视频文件格式,以及直接使用视频流
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
$ sudo apt-get install libxvidcore-dev libx264-dev
5.为了编译 highgui 模块,我们需要安装GTK开发库
$ sudo apt-get install libgtk2.0-dev libgtk-3-dev
6.通过安装一些额外的依赖项,可以进一步优化OpenCV内部的许多操作(即matrix矩阵操作)
$ sudo apt-get install libatlas-base-dev gfortran
7.安装 Python 2.7 和 Python 3,以便我们可以使用Python绑定编译OpenCV:
$ sudo apt-get install python2.7-dev python3-dev
ps:虽然这步明显系统会显示已经安装(raspbian系统自带),但教程提示别轻易跳过
步骤3:
1.下载OpenCV源代码
$ cd ~
$ wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.3.0.zip
$ unzip opencv.zip
2.把 opencv 移动到桌面(包括后面的opencv_contrive.zip,get-pip.zip,都可用到vnc的传输文件功能)
步骤4:
1.首先需要安装 pip ,一个Python包管理器
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py
$ sudo python3 get-pip.py
超时了。。。
然后重新弄就成功了。。。
2.安装Python虚拟环境
$ sudo pip install virtualenv virtualenvwrapper
$ sudo rm -rf ~/.cache/pip
3.更新我们的 〜/ .profile文件(该处与问教程有些许出路,按原教程会出错)
$ 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
4.创建Python虚拟环境并进入虚拟环境(以下开始都要在cv下进行,即python虚拟环境)
$ mkvirtualenv cv -p python2
$ source ~/.profile
$ workon cv
5.安装NumPy
又又又超时了。。。
换了个时间就成功了
步骤5:
1使用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 ..
2.查看 cmake输出的python3部分
3打开/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
4.重新启动交换服务
$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start
5.编译OpenCV, 安装OpenCV 3(时间很长且报错率很高)
$ make -j4
$ sudo make install
$ sudo ldconfig
步骤6:
1.检查OpenCV位置
$ ls -l /usr/local/lib/python3.7/site-packages/
2、将opencv编译得到的iso文件(在本地python工作目录下)更名
$ cd /usr/local/lib/python3.7/site-packages/
$ sudo mv cv2.cpython-37m-arm-linux-gnueabihf.so cv2.so #注意这里的python-37m
3、并放到python虚拟环境(.virtualenvs)的工作文件夹下
$ cd ~/.virtualenvs/cv/lib/python3.7/site-packages/
$ ln -s /usr/local/lib/python3.7/site-packages/opencv-3.3.0.so cv2.so
步骤7:
1.测试 OpenCV 3安装
$ source ~/.profile
$ workon cv
$ python
>>> import cv2
>>> cv2.__version__
'3.3.0'
>>>
从截图中可以看到,OpenCV 3已成功安装在我的Raspberry Pi 3 + Python 3.7环境中
2.打开 / 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
3.重新启动交换服务
$ sudo /etc/init.d/dphys-swapfile停止
$ sudo /etc/init.d/dphys-swapfile开始
使用opencv和python控制树莓派的摄像头
参考教程:还是可以参考Adrian Rosebrock的Accessing the Raspberry Pi Camera with OpenCV and Python
跑通教程的示例代码(有可能要调整里面的参数)
步骤1:进入python虚拟环境CV
步骤2:pip picamera包
步骤3:跑一下实例代码即可(其中修改一些参数)
示例代码1: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)
示例代码2:test_vedio.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()
camera.resolution = (640, 480)
camera.framerate = 32
rawCapture = PiRGBArray(camera, size=(640, 480))
# allow the camera to warmup
time.sleep(3)
# capture frames from the camera
for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
# grab the raw NumPy array representing the image, then initialize the timestamp
# and occupied/unoccupied text
image = frame.array
# show the frame
cv2.imshow("Frame", image)
key = cv2.waitKey(1) & 0xFF
# clear the stream in preparation for the next frame
rawCapture.truncate(0)
# if the `q` key was pressed, break from the loop
if key == ord("q"):
break
利用树莓派的摄像头实现人脸识别
人脸识别有开源的python库face_recognition,这当中有很多示例代码
参考教程:树莓派实现简单的人脸识别
要求:跑通[face_recognition]的示例代码facerec_on_raspberry_pi.py以及facerec_from_webcam_faster.py
1.检查配置,存在dev0即可
ls /dev/video*
2.库的安装(除了安装完的opencv+bumpy,还需要dlib、face_recognition)
pip install dlib
pip install face_recognition
3.文件结构
4.代码实现
结合微服务的进阶任务
使用微服务,部署opencv的docker容器(要能够支持arm),并在opencv的docker容器中跑通(3)的示例代码facerec_on_raspberry_pi.py
选做:在opencv的docker容器中跑通步骤(3)的示例代码facerec_from_webcam_faster.py
使用微服务,部署opencv的docker容器,并在opencv的docker容器中跑通(3)的示例代码
在树莓派上安装docker
#脚本安装docker
curl -fsSL https://get.docker.com -o get-docker.sh #下载安装脚本
sh get-docker.sh --mirror Aliyun #执行脚本
sudo usermod -aG docker $USER #填加用户组,这在树莓派reboot后docker指令就无需sudo特权了
验证安装情况
docker --version
镜像实现opencv
拉取镜像,并打开容器
因为容器内只有python+opencv
所以需要pip一下dlib face_recognision 和picamera[array]
容器在退出后所有更新会格式化,所以commit一个pip了所需包的镜像opencv
项目树结构
Dockerfile去build一个镜像
创建相关容器并python运行文件
这里配置信息device即挂载本机摄像头设备
docker run -it --device=/dev/vchiq --device=/dev/video0 --name myopencv opencv2
python3 facerec_on_raspberry_pi.py
实现成功
选做:在opencv的docker容器中跑通步骤(3)的示例代码
在Windows系统中安装Xming和Putty。安装好后,先打开Xming,然后打开Putty,开启树莓派的ssh配置中的X11。打开Putty后,把树莓派的IP地址填在下面这一栏里,端口用默认的就行了
查看X11是否打开
注:X11forwarding 显示yes即可
$ cat /etc/ssh/sshd_config
查看DISPLAY环境变量值
注:这个查看是在用Putty打开的窗口上查看到的,若直接在树莓派里的终端看,看到就是"DISPLAY=localhost:10.0"
printenv
编写run.sh
#sudo apt-get install x11-xserver-utils
xhost +
docker run -it \
--net=host \
-v $HOME/.Xauthority:/root/.Xauthority \
-e DISPLAY=:10.0 \
-e QT_X11_NO_MITSHM=1 \
--device=/dev/vchiq \
--device=/dev/video0 \
--name facerecgui \
myopencv \
python3 facerec_from_webcam_faster.py
打开终端,运行run.sh
sh run.sh
可以看到在windows的Xvideo可以正确识别人脸。
遇到的问题
问题1:创建Python虚拟环境出错(与教程有差异)
问题:
解决方法:
问题2:pip下载速度过慢,特别是numpy、还有picamara[array]等模块包,下着下载就time out了
可见速度之慢
解决方法:
-刚开始不太了解pip的时候就无脑挂机干等,但是解决不了timeout报错,肝到半夜发现凌晨4点的洛杉矶···网速真快
-后来按群里大佬的谈话发现,手动复制连接去下载whl文件然后放到python3工作目录下的site-package文件即可
-虽然一开始有想到这个方法,但不知道该文件包放哪才能让pip找到而无奈劝退...
问题3:编译
问题:cuda.hpp找不到
该文件的指定路径其实没有这个文件,但其实在xfeature2d这个东西在opencv_contrib是可以找到的
解决:
-有大佬是修改相应路径
-而我们选择暴力复制一个xfeature2d到路径下即可
问题:ffmpeg?相关问题
解决:
-百度了一下才发现应该是需要添加头文件
-home/pi/opencv-3.3.0/modules/videoio/src/cap_ffmpeg_impl.hpp下添加
#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
#define AVFMT_RAWPICTURE 0x0020
问题:缺少boostdesc
-这里可能会缺很多文件,不止截图中的一个
-原因似乎是因为在使用cmake创建build任务的那里,会出现你所需要的boostdesc部分文件因为网络无法连接而没法现在
解决:
-网上可找到相应部分的资源,下载解压然后放进相应路径下即可
问题:cv2.cpp.co更奇?怪的语法报错问题
解决:
-令人头痛的解决问题,编译问题很长也且容易被跳过(反正可能就是菜看不出来)
-问了群上大佬才知道需要进入相关文件去修改字符类型(大佬还是强的,以下是群里某大佬的回答)
编译问题
分工协作及总结
分工协作
学号 | 姓名 | 分工 |
---|---|---|
031702220 | 黄恒杰 | 实机操作,查阅资料,寻找解决方法 |
031702223 | 郑志强 | 博客编写,查阅资料,寻找解决方法 |
031702239 | 林国钦 | 博客编写,查阅资料,寻找解决方法 |
主要通过qq视频,群聊进行沟通和资料分享
小结
这次实验对于opencv的安装编译真是吐了...
成功安装opencv后,可能因为动到电源或是开太久,树莓派断连,然后连不上?看指示灯以为烧坏了还是啥...
心态差点炸了...重做咯
参照之前的试卷答案,似乎挺多人选择直接pip?
但是直接pip下的opencv似乎是在本地python上运行的而非cv下?这似乎失去了python虚拟环境的意义
老师说可跑即可?那python2下的直接installopencv不是更为简单?这里的教程安装py2下的opencv不要太舒服
但慢慢做到后面发现,学docker直接拉取opencv相关镜像额......那安装那个东西......emm对的,多动手有好处!