• 第7次实践作业


    第7次实践作业

    实验前的准备

    拓展文件系统

    扩展文件系统,以包括microSD卡上的所有空间。具体步骤如下:

    1、在树莓派终端(或者SSH)上输入:

    $ sudo raspi-config
    

    2、然后选择“高级选项”菜单项

    img

    3、然后选择“扩展文件系统”:

    img

    4、选择第一个选项“A1.Expand Filesystem”,按键盘上的Enter键,完成后点击“Finish”按钮,重新启动树莓派。

    重新启动后,文件系统已经扩展为包括micro-SD卡上的所有空间。可以通过执行 df -h 检查输出来验证磁盘是否已扩展。

    img

    5、此时我的树莓派文件系统已扩展为包含16GB的micor-SD卡可以删除LibreOffice和Wolfram引擎以释放Pi上的一些空间:

    $ sudo apt-get purge wolfram-engine
    $ sudo apt-get purge libreoffice*
    $ sudo apt-get clean
    $ sudo apt-get autoremove
    

    换源

    可以将更换树莓派源为清华镜像源,参考:更换清华/中国科技大学镜像系统

    在树莓派中安装opencv库

    安装依赖

    # 1、更新系统
    $ sudo apt-get update && sudo apt-get upgrade
    # 2、在树莓派上安装OpenCV所需要依赖的工具和一些图像视频库
    # 3、安装包括CMake的开发人员工具
    # 安装build-essential、cmake、git和pkg-config
    $ sudo apt-get install build-essential cmake git pkg-config
    # 4、安装常用图像工具包:tif格式图像工具包、JPEG-2000图像工具包、png图像工具包
    $ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
    # 5、安装常用的视频库
    $ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
    $ sudo apt-get install libxvidcore-dev libx264-dev
    # 6、安装GTK
    $ sudo apt-get install libgtk2.0-dev libgtk-3-dev
    # 7、安装OpenCV数值优化函数包
    $ sudo apt-get install libatlas-base-dev gfortran
    # 8、安装 Python2.7 & Python3,一般自带
    $ sudo apt-get install python2.7-dev python3-dev
    

    下载并编译OpenCV源码

    下载opencv4.3.0和opencv_contrib4.3.0

    # 下载OpenCV
    $ wget -O opencv-4.3.0.zip https://codeload.github.com/opencv/opencv/zip/4.3.0
    # 下载OpenCV_contrib库
    $ wget -O opencv_contrib-4.3.0.zip https://codeload.github.com/opencv/opencv_contrib/zip/4.3.0
    

    解压opencv4.3.0和opencv_contrib4.3.0

    $ unzip opencv-4.3.0.zip
    $ unzip opencv_contrib-4.3.0.zip
    

    正确解压opencv4.3.0:

    img

    正确解压opencv_contrib-4.3.0.zip:

    img

    编译源码前的准备

    安装pip

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

    img

    Python虚拟环境安装(不安装也是可以的),它通过为每个项目创建隔离的、独立的Python环境,将不同项目所需的依赖项保存在不同的位置,以解决依赖冲突:

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

    img

    为Python虚拟环境配置环境变量

    # 配置virtualenv 和 virtualenvwrapper 的环境变量
    $ echo -e "
    # 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
    

    img

    创建Python3虚拟环境

    $ mkvirtualenv cv -p python3
    # 进入Python虚拟环境
    $ workon cv
    

    安装 Numpy(在Python虚拟环境中),过程很耗时:

    $ pip install numpy
    

    img

    编译并安装OpenCV

    $ cd ~/opencv-4.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-4.3.0/modules 
        -D BUILD_EXAMPLES=ON ..
    

    tips:

    • CMAKE_BUILD_TYPE是编译方式
    • CMAKE_INSTALL_PREFIX是安装目录
    • OPENCV_EXTRA_MODULES_PATH是加载额外模块
    • INSTALL_PYTHON_EXAMPLES是安装官方python例程
    • BUILD_EXAMPLES是编译例程(这两个可以不加,不加编译稍微快一点点,想要C语言的例程的话,在最后一行前加参数INSTALL_C_EXAMPLES=ON,要C++例程的话在最后一行前加参数INSTALL_C_EXAMPLES=ONINSTALL_CXX_EXAMPLES=ON)

    img

    增加交换空间的大小

    这使得OpenCV能够编译树莓PI的所有四个内核,而不会因为内存问题而导致编译挂起。

    打开/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
    ...
    

    为了激活新的交换空间,重新启动该服务:

    $ sudo /etc/init.d/dphys-swapfile stop
    $ sudo /etc/init.d/dphys-swapfile start
    

    最后,终于到了编译OpenCV的时候了,使用make -j4命令对OpenCV进行编译,这个阶段很费时。

    img

    编译完成后,就可以安装OpenCV了。使用如下命令进行安装OpenCV:

    $ sudo make install
    $ sudo ldconfig
    

    img

    更名:

    $ cd /usr/local/lib/python3.7/site-packages/
    $ sudo mv cv2.cpython-35m-arm-linux-gnueabihf.so cv2.so
    

    然后进入Python3的shell进行验证:

    img

    出现版本信息即为成功安装OpenCV库。

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

    首先安装picamera

    $ pip install "picamera[array]"
    

    使用示例程序进行拍照,python代码如下:

    # 导入必要的依赖包
    from picamera.array import PiRGBArray
    from picamera import PiCamera
    import time
    import cv2
    # 初始化摄像头
    camera = PiCamera()
    rawCapture = PiRGBArray(camera)
    # 调整感光时间
    time.sleep(5)
    # 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)
    

    结果如下图所示:

    img

    使用示例程序进行视频流传输:

    # 导入依赖
    from picamera.array import PiRGBArray
    from picamera import PiCamera
    import time
    import cv2
    # 初始化摄像头
    camera = PiCamera()
    camera.resolution = (1024, 720)
    camera.framerate = 32
    rawCapture = PiRGBArray(camera, size=(1024, 720))
    # 感光时间
    time.sleep(5)
    
    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)
    	# 输入q退出
    	if key == ord("q"):
    		break
    

    使用UFO测试一下摄像头的帧率:

    img

    从实际观感上看,视频流帧率大概为30帧每秒。

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

    首先需要安装必要的依赖:

    $ pip install dlib face_recognition numpy
    

    创建一个facerec_on_raspberry_pi.py文件、输入代码(我使用的是Donald Trump的照片进行学习),然后运行它。注意需要在代码同目录下放置用于学习的图片。

    img

    img

    接下来安装webcam并创建facerec_from_webcam_faster.py文件、输入代码,并运行它。

    $ sudo apt-get install fswebcam
    $ python3 facerec_from_webcam_faster.py
    

    使用以下两张图片进行学习:

    img

    并对一张图片进行识别:

    img

    可见,正确识别出两人。

    结合微服务的进阶任务

    在opencv的docker容器中跑facerec_on_raspberry_pi.py

    首先在树莓派上安装docker,可以使用以下两步进行脚本安装:

    $ curl -fsSL https://get.docker.com -o get-docker.sh
    $ sh get-docker.sh --mirror Aliyun
    

    将当前用户加入到docker组就能够在使用docker命令时不需要加sudo了:

    $ sudo usermod -aG docker pi
    

    由于OpenCV安装过于复杂且费时,使用OpenCV容器可以直接省去了安装步骤。拉取如下镜像:

    $ docker pull sixsq/opencv-python
    

    基于以上镜像,更新pip以及pip3,并安装picamera[array]dlibface_recognition,并设置启动时执行的命令:ENTRYPOINT["python3"]。完整dockerfile文件如下:

    FROM sixsq/opencv-python
    RUN mkdir ~/.pip && mkdir -p /usr/local/faceRe && chmod -R 777 /usr/local/faceRe
    COPY pip.conf ~/.pip/
    RUN pip3 install --upgrade pip && pip install --upgrade pip 
    	&& pip3 install "picamera[array]" 
    	&& pip3 install dlib 
    	&& pip3 install face_recognition
    WORKDIR /usr/local/faceRe
    ENTRYPOINT [ "python3" ]
    RUN apt-get update && apt install x11-xserver-utils
    

    img

    成功创建镜像后,使用如下命令启动容器:

    $ docker run -it --rm -v [本地代码目录]:[容器工作目录] --device=/dev/vchiq --device=/dev/video0 [镜像名] [人脸识别python代码]
    

    实例:

    $ docker run -it --rm -v /usr/local/faceRe:/usr/local/faceRe --device=/dev/vchiq --device=/dev/video0 opencvenv facerec_on_raspberry_pi.py
    

    img

    同样地,程序运行正确。

    选做:在opencv的docker容器中跑facerec_from_webcam_faster.py

    因为需要使用X11服务,所以在上面的Dockerfile中还需要添加一句RUN apt-get update && apt install x11-xserver-utils -y再构建新的镜像。

    $ docker build -t opencvenv:v2 .
    

    img

    使用如下命令启动容器。

    $ xhost +
    $ sudo docker run -it --rm 
    	-v /usr/local/faceRe:/usr/local/faceRe 
    	-v /tmp/.X11-unix:/tmp/.X11-unix 
    	-e DISPLAY=$DISPLAY 
    	-e QT_X11_NO_MITSHM=1 
    	--device=/dev/vchiq 
    	--device=/dev/video0 
    	opencvenv:v2 
    	facerec_from_webcam_faster.py
    

    成功运行程序后,会弹出Video窗口:

    img

    成功识别。微服务作业文件结构为:

    img

    问题与解决办法

    问题1:Python 3虚拟环境启动失败。

    img

    解决:按如下代码配置环境变量。

    $ echo "export WORKON_HOME=$HOME/.virtualenvs" >> ~/.profile
    $ echo "export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3" >> ~/.profile
    $ echo "export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv" >> ~/.profile
    $ echo "source /usr/local/bin/virtualenvwrapper.sh" >> ~/.profile
    $ echo "export VIRTUALENVWRAPPER_ENV_BIN_DIR=bin" >> ~/.profile
    

    问题2:hpp文件缺失情况。

    img

    解答:这些是头文件出现问题,可以把下面文件夹里的两个文件拷贝到/home/pi/opencv_contrib-4.3.0/modules/xfeatures2d/test,然后打开这个文件,修改下头文件。

    img

    img

    接下来出现的同类问题,可以采取同样的解决方法。

    小组协作

    1、小组使用腾讯会议进行语音交流,组长使用共享屏幕的方式向组员展示树莓派情况,图中显示为实验到达编译OpenCV的阶段。

    img

    2、组员查询问题的解决方法,由拥有树莓派的组长进行实际操作。

    img

    img

    3、第一天共协作5小时,实验进度到达微服务

    img

    4、第二天共花时4小时进行微服务实验。

    img

    整个实验过程共花费11.5个小时左右。

    小组分工

    组员 工作
    111701205-陈志明 操作树莓派,解决实际问题,编写博客,错误总结
    081700104-高鹏 调查资料,查找问题解决办法
    031702644-钟博 调查资料,提供实验素材

    参考资料:

    Raspbian Stretch: Install OpenCV 3 + Python on your Raspberry Pi

    树莓派3B/3B+和4B安装OpenCV教程

    更换清华/中国科技大学镜像系统

    ERROR: Environment '/home/pi/.virtualenvs/cv' does not contain an activate script

    编译OpenCV提示opencv_contrib缺少boostdesc_bgm.i等文件

    树莓派4的opencv4.1.0--python3.7的开发环境安装

    Accessing the Raspberry Pi Camera with OpenCV and Python

    树莓派实现简单的人脸识别

    Raspberry Pi 4B 使用OpenCV访问摄像头picamera模块

  • 相关阅读:
    响应式设计的5个CSS实用技巧
    jquery获取浏览器高度、宽度和滚动条高度
    jquery和其他库发生冲突的解决办法
    雅虎的14条性能优化原则
    手机网站前端开发布局技巧
    手机网站前端开发经验总结
    -webkit-scrollbar
    as3中TextFormat类的使用
    flash全屏后的UI控制
    字符串类的算法题
  • 原文地址:https://www.cnblogs.com/auspiciousjimmy/p/13062222.html
Copyright © 2020-2023  润新知