zoukankan      html  css  js  c++  java
  • 第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对的,多动手有好处!

  • 相关阅读:
    希望走过的路成为未来的基石
    第三次个人作业--用例图设计
    第二次结对作业
    第一次结对作业
    第二次个人编程作业
    第一次个人编程作业(更新至2020.02.07)
    Springboot vue 前后分离 跨域 Activiti6 工作流 集成代码生成器 shiro权限
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    spring cloud springboot 框架源码 activiti工作流 前后分离 集成代码生成器
    java代码生成器 快速开发平台 二次开发 外包项目利器 springmvc SSM后台框架源码
  • 原文地址:https://www.cnblogs.com/zzqsss/p/13109752.html
Copyright © 2011-2022 走看看