第7次实践作业

在树莓派中安装opencv库

参考教程:关于opencv的编译安装,可以参考Adrian Rosebrock的Raspbian Stretch: Install OpenCV 3 + Python on your Raspberry Pi

步骤1:

1.扩展文件系统后重新启动Pi

reboot.jpg

2.验证磁盘是否已扩展并检查输出

vetify.jpg

步骤2:

1.更新和升级任何现有软件包

$ sudo apt-get update && sudo apt-get upgrade

updata&upgrade.jpg

2.安装开发人员工具来可以帮助我们配置OpenCV构建过程

$ sudo apt-get install build-essential cmake pkg-config

cmake.jpg

3.安装 image I/O packages 以允许我们从磁盘加载各种映像文件格式

$ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev

image-io.jpg

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

vedeo-io-1.jpg

vedeo-io-2.jpg

5.为了编译 highgui 模块,我们需要安装GTK开发库

$ sudo apt-get install libgtk2.0-dev libgtk-3-dev

highgui.jpg

6.通过安装一些额外的依赖项,可以进一步优化OpenCV内部的许多操作(即matrix矩阵操作)

$ sudo apt-get install libatlas-base-dev gfortran

matrix.jpg

7.安装 Python 2.7 和 Python 3,以便我们可以使用Python绑定编译OpenCV:

$ sudo apt-get install python2.7-dev python3-dev

python-already.jpg

ps:虽然这步明显系统会显示已经安装(raspbian系统自带),但教程提示别轻易跳过

python-warn

步骤3:

1.下载OpenCV源代码

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

opencv-code.jpg

2.把 opencv 移动到桌面(包括后面的opencv_contrive.zip,get-pip.zip,都可用到vnc的传输文件功能)

transfile-opencv.jpg

步骤4:

1.首先需要安装 pip ,一个Python包管理器

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

超时了。。。

get-pip-timeout.jpg

然后重新弄就成功了。。。

get-pip-success.jpg

2.安装Python虚拟环境

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

virtual.jpg

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

profilr.jpg

4.创建Python虚拟环境并进入虚拟环境(以下开始都要在cv下进行,即python虚拟环境)

$ mkvirtualenv cv -p python2
$ source ~/.profile
$ workon cv

cv.jpg

5.安装NumPy

又又又超时了。。。

numpy-timeout.jpg

换了个时间就成功了

numpy-success.png

步骤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部分

build-py3.png

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 

change.png

5.编译OpenCV, 安装OpenCV 3(时间很长且报错率很高)

$ make -j4
$ sudo make install
$ sudo ldconfig

install.png

步骤6:

1.检查OpenCV位置

$ ls -l /usr/local/lib/python3.7/site-packages/

checkcv2.png

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'
>>>

success.png

从截图中可以看到,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

changeback.png

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)

test_images.jpg

示例代码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

test_vedeo.jpg


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

人脸识别有开源的python库face_recognition,这当中有很多示例代码
参考教程:树莓派实现简单的人脸识别
要求:跑通[face_recognition]的示例代码facerec_on_raspberry_pi.py以及facerec_from_webcam_faster.py

1.检查配置,存在dev0即可

ls /dev/video*

lenlian-camera.png

2.库的安装(除了安装完的opencv+bumpy,还需要dlib、face_recognition)

pip install dlib
pip install face_recognition

lenlian-pip.png

3.文件结构

lenlian-file.png

4.代码实现

finf1.png

find2.png


结合微服务的进阶任务

使用微服务,部署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

docker.png

镜像实现opencv

拉取镜像,并打开容器

docker-1.png

因为容器内只有python+opencv

所以需要pip一下dlib face_recognision 和picamera[array]

docker-2.png

容器在退出后所有更新会格式化,所以commit一个pip了所需包的镜像opencv

docker-3.png

项目树结构

docker-tree

Dockerfile去build一个镜像

docker-4.png

创建相关容器并python运行文件

这里配置信息device即挂载本机摄像头设备

docker run -it --device=/dev/vchiq --device=/dev/video0 --name myopencv opencv2
python3 facerec_on_raspberry_pi.py

docker-5.png

实现成功

docker-5s.png

选做:在opencv的docker容器中跑通步骤(3)的示例代码

在Windows系统中安装XmingPutty。安装好后,先打开Xming,然后打开Putty,开启树莓派的ssh配置中的X11。打开Putty后,把树莓派的IP地址填在下面这一栏里,端口用默认的就行了

putty1.png

putty2.png

查看X11是否打开

注:X11forwarding 显示yes即可

$ cat /etc/ssh/sshd_config

putty3

查看DISPLAY环境变量值

注:这个查看是在用Putty打开的窗口上查看到的,若直接在树莓派里的终端看,看到就是"DISPLAY=localhost:10.0"

printenv

printenv.png

编写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可以正确识别人脸。

docker-6suc.png


遇到的问题

问题1:创建Python虚拟环境出错(与教程有差异)

问题:

cv-error.jpg

解决方法:

cv-errorfix.jpg

问题2:pip下载速度过慢,特别是numpy、还有picamara[array]等模块包,下着下载就time out了

numpy-timeout
可见速度之慢
解决方法:
-刚开始不太了解pip的时候就无脑挂机干等,但是解决不了timeout报错,肝到半夜发现凌晨4点的洛杉矶···网速真快
numpy-success
-后来按群里大佬的谈话发现,手动复制连接去下载whl文件然后放到python3工作目录下的site-package文件即可
-虽然一开始有想到这个方法,但不知道该文件包放哪才能让pip找到而无奈劝退...

问题3:编译

问题:cuda.hpp找不到

q1

该文件的指定路径其实没有这个文件,但其实在xfeature2d这个东西在opencv_contrib是可以找到的
解决:
-有大佬是修改相应路径
-而我们选择暴力复制一个xfeature2d到路径下即可

问题:ffmpeg?相关问题

q2

解决:
-百度了一下才发现应该是需要添加头文件
-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对的,多动手有好处!

posted @ 2020-06-12 10:16  Wasted  阅读(196)  评论(0编辑  收藏  举报