• 第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 "
    # 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对的,多动手有好处!

  • 相关阅读:
    jms学习笔记
    UML类图与类的关系详解
    javolution学习--介绍
    Eclipse中10个最有用的快捷键组合
    [疯狂Java]JDBC:PreparedStatement预编译执行SQL语句
    Oracle OLAP 与 OLTP 介绍
    DRDS SQL兼容性
    DRDS 概述
    跨时代的分布式数据库 – 阿里云DRDS详解(转)
    java.net.UnknownHostException: www.terracotta.org
  • 原文地址:https://www.cnblogs.com/zzqsss/p/13109752.html
Copyright © 2020-2023  润新知