• Install OpenCV 4 on your Raspberry Pi4


    在树莓派4上安装OpenCV4

    1. 前言


     

    1.1. 参考资料

    1. Install OpenCV 4 on your Raspberry Pi:中文网站上关于树莓派上安装OpenCV4的文章大多来自于此,为众多开发者的提供了极大的帮助。
    2. 编译OpenCV以及openc_contrib提示缺少boostdesc_bgm.i文件出错的解决:网络的不佳可能会导致缺少部分文件。

    1.2. 心理准备

    1. 整个安装过程总时长约4个小时,绝大多数时间耗费在 cmake 的步骤上。
    2. 安装途中,可能会遇到各种各样的小问题,然而在互联网上都能够得到解决方法。
    3. 使用此方法能够在RaspberryPi4顺利安装OpenCV4。

     “不麻痹、不厌战、不松劲,咬紧牙关一鼓作气!”

    2. 准备


     

    2.1. 树莓派

    1. 终端,一般而言有如下方式开启终端:
      1. SSH;
      2. VNC;
      3. HDMI + 显示器。
    2. 联网,应确保树莓派能够连接互联网,一般而言有如下方式联网:
      1. 网线;
      2. Wi-Fi。
    3. 摄像头,安装完毕后,岂不赶紧看看效果?
      1. CSI摄像头。

    2.2. 安装包

    当前(2020年6月15日)最新发布包是 4.3.0 版本,激进的开发者当仁不让会选择最新的开发版本。

    访问Github下载以下源码包:

    1. opencv:opencv-4.3.0.tar.gz
    2. opencv_contrib:opencv_contrib-4.3.0.tar.gz

    注意:直接下载的opencvopencv_contril压缩包名称都为"4.3.0.tar.gz,需注意区分。

    3. 系统配置


     

    3.1. 扩展文件系统

    在安装opencv之前需要确保安装其依赖包,文件系统的空间可能不足,因此需要扩展文件系统以包含整个SD的空间。

    1. 键入 df -h 查看空间使用情况,92%已使用表明当前迫切需要扩展文件系统。
      $ df -h
      文件系统        容量  已用  可用 已用% 挂载点
      /dev/root     7.0G  6.1G  602M   92% /
      devtmpfs     1.8G     0  1.8G    0% /dev
      tmpfs          1.9G     0  1.9G    0% /dev/shm
      tmpfs          1.9G  8.5M  1.9G    1% /run
      tmpfs          5.0M  4.0K  5.0M    1% /run/lock
      tmpfs          1.9G     0  1.9G    0% /sys/fs/cgroup
      /dev/mmcblk0p1  253M   52M  201M   21% /boot
      tmpfs          386M     0  386M    0% /run/user/1000
    2. 键入 sudo rasp-con ,打开配置工具。
    3. 按动 ↑[Up] 、 ↓[Down] 、 Enter 键,依次选择“ 7 Advanced Options Configure advanced settings ”-->“ A1 Expand Filesystem Ensures that all of the SD card storage is available to the ”-->“ Finish ”。
    4. 回到终端后,键入 sudo reboot 以重启树莓派。
    5. 重新通过 SSH 连接树莓派后,键入 df -h 命令后,可以看到文件系统容量已扩展至整张SD卡,再无空间不够之虞。
      $ df -h
      文件系统        容量  已用  可用 已用% 挂载点
      /dev/root        29G  6.1G  22.1G   23% /
      devtmpfs        1.8G     0  1.8G    0% /dev
      tmpfs           1.9G     0  1.9G    0% /dev/shm
      tmpfs           1.9G  8.5M  1.9G    1% /run
      tmpfs           5.0M  4.0K  5.0M    1% /run/lock
      tmpfs           1.9G     0  1.9G    0% /sys/fs/cgroup
      /dev/mmcblk0p1  253M   52M  202M   21% /boot
      tmpfs           386M     0  386M    0% /run/user/1000

    3.2. 安装依赖包

    1.  系统更新,键入 sudo apt-get update && sudo apt-get upgrade ,更新软件包列表。
      $ sudo apt-get update && sudo apt-get upgrade
      命中:1 http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian buster InRelease
      命中:2 http://mirrors.tuna.tsinghua.edu.cn/raspberrypi buster InRelease
      正在读取软件包列表... 完成
      正在读取软件包列表... 完成
      正在分析软件包的依赖关系树
      正在读取状态信息... 完成
      正在计算更新... 完成
      ...
    2. 安装常用图像工具包。
      sudo apt-get install libjpeg8-dev libtiff5-dev libjasper-dev libpng12-dev
    3. 安装常用视频工具包。
      sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
      sudo apt-get install libxvidcore-dev libx264-dev
    4. 安装GTK。
      sudo apt-get install libgtk-3-dev
      sudo apt-get install libcanberra-gtk*
    5. 安装OpenCV数值优化函数包。
      sudo apt-get install libatlas-base-dev gfortra
      
    6. 安装Python 3。
      sudo apt-get install python3-dev
      
    7. 升级 pip 并安装 numpy 。
      $ wget https://bootstrap.pypa.io/get-pip.py
      $ sudo python3 get-pip.py
      $ sudo pip3 install numpy
      Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
      Requirement already satisfied: numpy in /usr/lib/python3/dist-packages (1.16.2)

    4. opencv安装


     

    4.1. 安装包解压

    1. 将“opencv-4.3.0.tar.gz与"opencv_contrib-4.3.0.tar.gz拷贝至 /home/pi 路径下。
    2. 解压“opencv-4.3.0.tar.gz”到当前路径,并修改文件夹为 opencv (国际惯例)。
      tar zxvf opencv-4.3.0.tar.gz
      mv opencv-4.3.0 opencv
      
    3. 解压“opencv_contrib-4.3.0.tar.gz”到当前路径,并修改文件夹为 opencv_contrib (同上)。
      tar zxvf opencv_contrib-4.3.0.tar.gz
      mv opencv_contrib-4.3.0 opencv_contrib
      tar zxvf opencv_contrib-4.3.0.tar.gz
      mv opencv_contrib-4.3.0 opencv_contrib
      tar zxvf opencv_contrib-4.3.0.tar.gz
      mv opencv_contrib-4.3.0 opencv_contrib

    4.2. cmake

    1. 进入opencv目录。
      cd opencv
    2. 创建并进入build目录。
      mkdir build
      cd build/
    3. 执行cmake。
      cmake -D CMAKE_BUILD_TYPE=RELEASE 
         -D CMAKE_INSTALL_PREFIX=/usr/local 
         -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules 
         -D ENABLE_NEON=ON 
         -D ENABLE_VFPV3=ON 
         -D BUILD_TESTS=ON 
         -D OPENCV_ENABLE_NONFREE=ON 
         -D INSTALL_PYTHON_EXAMPLES=ON 
         -D INSTALL_C_EXAMPLES=ON 
         -D BUILD_EXAMPLES=ON ..

    Note:

    编译选项:
    CMAKE_BUILD_TYPE:编译方式;
    CMAKE_INSTALL_PREFIX:安装目录;
    OPENCV_EXTRA_MODULES_PATH:额外模块的路径;
    ENABLE_NEON:启用neon;
    ENABLE_VFPV3:启用vfpvfp;
    BUILD_TESTS:编译测试例程;
    OPENCV_ENABLE_NONFREE:启用nonfree;
    INSTALL_PYTHON_EXAMPLES:安装官方Python例程;
    INSTALL_C_EXAMPLES:安装官方C例程;
    BUILD_EXAMPLES:编译例程。

    合理配置`cmake`配置项,加快编译速度。
    已知在编译**examples**时会产生编译错误。

    -- General configuration for OpenCV 4.3.0 =====================================
    --   Version control:               unknown
    --
    --   Extra modules:
    --     Location (extra):            /home/pi/opencv_contrib/modules
    --     Version control (extra):     unknown
    --
    --   Platform:
    --     Timestamp:                   2020-06-15T14:28:32Z
    --     Host:                        Linux 4.19.75-v7l+ armv7l
    --     CMake:                       3.13.4
    --     CMake generator:             Unix Makefiles
    --     CMake build tool:            /usr/bin/make
    --     Configuration:               RELEASE
    --
    --   CPU/HW features:
    --     Baseline:                    VFPV3 NEON
    --       requested:                 DETECT
    --       required:                  VFPV3 NEON
    --
    --   C/C++:
    --     Built as dynamic libs?:      YES
    --     C++ standard:                11
    --     C++ Compiler:                /usr/bin/c++  (ver 8.3.0)
    --     C++ flags (Release):         -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -mfpu=neon -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG  -DNDEBUG
    --     C++ flags (Debug):           -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -mfpu=neon -fvisibility=hidden -fvisibility-inlines-hidden -g  -O0 -DDEBUG -D_DEBUG
    --     C Compiler:                  /usr/bin/cc
    --     C flags (Release):           -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -mfpu=neon -fvisibility=hidden -O3 -DNDEBUG  -DNDEBUG
    --     C flags (Debug):             -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -mfpu=neon -fvisibility=hidden -g  -O0 -DDEBUG -D_DEBUG
    --     Linker flags (Release):      -Wl,--gc-sections -Wl,--as-needed
    --     Linker flags (Debug):        -Wl,--gc-sections -Wl,--as-needed
    --     ccache:                      NO
    --     Precompiled headers:         NO
    --     Extra dependencies:          dl m pthread rt
    --     3rdparty dependencies:
    --
    --   OpenCV modules:
    --     To be built:                 aruco bgsegm bioinspired calib3d ccalib core datasets dnn dnn_objdetect dnn_superres dpm face features2d flann freetype fuzzy gapi hfs highgui img_hash imgcodecs imgproc intensity_transform line_descriptor ml objdetect optflow phase_unwrapping photo plot python2 python3 quality rapid reg rgbd saliency shape stereo stitching structured_light superres surface_matching text tracking ts video videoio videostab xfeatures2d ximgproc xobjdetect xphoto
    --     Disabled:                    world
    --     Disabled by dependency:      -
    --     Unavailable:                 alphamat cnn_3dobj cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev cvv hdf java js matlab ovis sfm viz xfeatures2d
    --     Applications:                tests perf_tests examples apps
    --     Documentation:               NO
    --     Non-free algorithms:         YES
    --
    --   GUI:
    --     GTK+:                        YES (ver 3.24.5)
    --       GThread :                  YES (ver 2.58.3)
    --       GtkGlExt:                  NO
    --     VTK support:                 NO
    --
    --   Media I/O:
    --     ZLib:                        /usr/lib/arm-linux-gnueabihf/libz.so (ver 1.2.11)
    --     JPEG:                        /usr/lib/arm-linux-gnueabihf/libjpeg.so (ver 62)
    --     WEBP:                        build (ver encoder: 0x020f)
    --     PNG:                         /usr/lib/arm-linux-gnueabihf/libpng.so (ver 1.6.36)
    --     TIFF:                        /usr/lib/arm-linux-gnueabihf/libtiff.so (ver 42 / 4.1.0)
    --     JPEG 2000:                   build Jasper (ver 1.900.1)
    --     OpenEXR:                     build (ver 2.3.0)
    --     HDR:                         YES
    --     SUNRASTER:                   YES
    --     PXM:                         YES
    --     PFM:                         YES
    --
    --   Video I/O:
    --     DC1394:                      NO
    --     FFMPEG:                      YES
    --       avcodec:                   YES (58.35.100)
    --       avformat:                  YES (58.20.100)
    --       avutil:                    YES (56.22.100)
    --       swscale:                   YES (5.3.100)
    --       avresample:                NO
    --     GStreamer:                   NO
    --     v4l/v4l2:                    YES (linux/videodev2.h)
    --
    --   Parallel framework:            pthreads
    --
    --   Trace:                         YES (with Intel ITT)
    --
    --   Other third-party libraries:
    --     Lapack:                      NO
    --     Eigen:                       NO
    --     Custom HAL:                  YES (carotene (ver 0.0.1))
    --     Protobuf:                    build (3.5.1)
    --
    --   OpenCL:                        YES (no extra features)
    --     Include path:                /home/pi/opencv/3rdparty/include/opencl/1.2
    --     Link libraries:              Dynamic load
    --
    --   Python 2:
    --     Interpreter:                 /usr/bin/python2.7 (ver 2.7.16)
    --     Libraries:                   /usr/lib/arm-linux-gnueabihf/libpython2.7.so (ver 2.7.16)
    --     numpy:                       /usr/lib/python2.7/dist-packages/numpy/core/include (ver 1.16.2)
    --     install path:                lib/python2.7/dist-packages/cv2/python-2.7
    --
    --   Python 3:
    --     Interpreter:                 /usr/bin/python3 (ver 3.7.3)
    --     Libraries:                   /usr/lib/arm-linux-gnueabihf/libpython3.7m.so (ver 3.7.3)
    --     numpy:                       /usr/lib/python3/dist-packages/numpy/core/include (ver 1.16.2)
    --     install path:                lib/python3.7/dist-packages/cv2/python-3.7
    --
    --   Python (for build):            /usr/bin/python2.7
    --
    --   Java:
    --     ant:                         /usr/bin/ant (ver 1.10.5)
    --     JNI:                         NO
    --     Java wrappers:               NO
    --     Java tests:                  NO
    --
    --   Install to:                    /usr/local
    -- -----------------------------------------------------------------
    --
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/pi/opencv/build
    cmake

    4.3. 增大SWAP空间

    1. 看到其他开发者编译opencv时由于SWAP过小,导致编译失败。在这儿,增大SWAP空间至2GB。
      $ sudo vi /etc/dphys-swapfile
      # ------------------>
      # 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=2048

       Note:  
      在编译完成后,应当将`CONF_SWAPSIZE`改回100MB。

    2. 重新启动交换服务。
      sudo /etc/init.d/dpshys-swapfile stop
      sudo /etc/init.d/dphys-swapfile start

    4.4. 执行编译(make)

    4.4.1. make -j4

    编译。在此分配4个核心来进行编译。

    $ make -j4
    Scanning dependencies of target libprotobuf
    Scanning dependencies of target libwebp
    Scanning dependencies of target libjasper
    Scanning dependencies of target IlmImf
    [  0%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jas_cm.c.o
    [  0%] Building C object 3rdparty/libwebp/CMakeFiles/libwebp.dir/src/dec/alpha_dec.c.o
    [  0%] Building CXX object 3rdparty/protobuf/CMakeFiles/libprotobuf.dir/src/google/protobuf/arena.cc.o
    [  0%] Building C object 3rdparty/libwebp/CMakeFiles/libwebp.dir/src/dec/buffer_dec.c.o
    [  0%] Building CXX object 3rdparty/openexr/CMakeFiles/IlmImf.dir/Half/half.cpp.o
    [  0%] Building C object 3rdparty/libwebp/CMakeFiles/libwebp.dir/src/dec/frame_dec.c.o
    [  0%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jas_debug.c.o
    [  0%] Building C object 3rdparty/libwebp/CMakeFiles/libwebp.dir/src/dec/idec_dec.c.o

    4.4.2. 编译报错

    4.4.2.1. fatal error: boostdesc_bgm.i
    /home/pi/opencv_contrib/modules/xfeatures2d/src/boostdesc.cpp:654:20: fatal error: boostdesc_bgm.i: 没有那个文件或目录
               #include ""
                        ^~~~~~~~~~~~~~~~~
    

    解决方法:

    [编译OpenCV以及openc_contrib提示缺少boostdesc_bgm.i文件出错的解决](https://blog.csdn.net/u011736771/article/details/85960300)

    错误:

    ~/opencv_contrib/modules/xfeatures2d/src/boostdesc.cpp:673:20: > fatal error: boostdesc_bgm.i: No such file or directory
    解决方式:

    采用的是源码编译的方式,所以可以查看 build 文件夹下的日志文件 > CMakeDownloadLog.txt,在日志文件CMakeDownloadLog.txt中搜索boostdesc_bgm.i 关键词 (不是在文件夹中搜索),
    发现这个文件下载失败了。日志文件里就有它的下载地址,直接复制其下载地址到网> 页可以看该到文件的源码,直接拷贝源码并生存同名文件,放在 opencv_contrib/> modules/xfeatures2d/src/ 路径下即可。

    总共缺了以下几个文件,都需要拷贝:

        boostdesc_bgm.i
        boostdesc_bgm_bi.i
        boostdesc_bgm_hd.i
        boostdesc_lbgm.i
        boostdesc_binboost_064.i
        boostdesc_binboost_128.i
        boostdesc_binboost_256.i
        vgg_generated_120.i
        vgg_generated_64.i
        vgg_generated_80.i
        vgg_generated_48.i

    参考:
    [fatal error: boostdesc_bgm.i: No such file or directory](https://github.com/opencv/opencv_contrib/issues/1301)

    ps: 不懂操作的,点开上面这个网址往下拉,有人提供了缺失的各个文件的链接,点> 击保存. 或者直接在这个网页里搜索 BenbenIO 这个用户的回复.

    4.4.2.2. opencv error: ‘SURF’ has not been declared
    1. opencv_contrib没有找到响应的头文件,对比 ~/opencv/modules/features2d/test/ 与 ~/opencv_contrib/modules/xfeatures2d/test/ ,将 opencv_contrib 缺少的“.hpp”文件拷贝一份。
      • test_descriptors_invariance.impl.hpp
      • test_descriptors_regression.impl.hpp
      • test_detectors_invariance.impl.hpp
      • test_detectors_regression.impl.hpp
      • test_invariance_utils.hpp
      • 注意:没有test_precomp.hpp文件。
    2. 将 ~/opencv/modules/features2d/test/ 中的“test_*.cpp”头文件引用路径修改为当前路径。
      // Before Modify
      // #include "features2d/test/test_detectors_regression.impl.hpp"
      // #include "features2d/test/test_descriptors_regression.impl.hpp"
      
      // Now
      #include "test_detectors_regression.impl.hpp"
      #include "test_descriptors_regression.impl.hpp"

       参见:[树莓派安装OpenCV-4.1.0及Contrib](https://blog.csdn.net/qq_27971677/article/details/90400118)

    4.5. install

    sudo make install
    sudo ldconfig
    

    5. 测试用例


     

    5.1. 查看opencv版本号

    键入如下命令,看到版本号为 4.3.0 则表明安装成功。

    python

    在 python 中输入如下命令。

    Python 2.7.16 (default, Oct 10 2019, 22:02:15)
    [GCC 8.3.0] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import cv2
    >>> cv2.__version__
    '4.3.0'

    5.2. 打开摄像头

    1. 使用VNC连接树莓派。
    2. 依次点击 `编程`-->Thonny Python IDE
    3. 输入如下的代码。
      import cv2
      cap=cv2.VideoCapture(0)  #调用摄像头‘0’一般是打开电脑自带摄像头,‘1’是打开外部摄像头(只有一个摄像头的情况)
      width=960
      height=600
      cap.set(cv2.CAP_PROP_FRAME_WIDTH,width)#设置图像宽度
      cap.set(cv2.CAP_PROP_FRAME_HEIGHT,height)#设置图像高度
      #显示图像
      while True:
          ret,frame=cap.read()#读取图像(frame就是读取的视频帧,对frame处理就是对整个视频的处理)
          #print(ret)#
          #######例如将图像灰度化处理,
          img=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#转灰度图
          cv2.imshow("img",img)
          ########图像不处理的情况
          frame = cv2.flip( frame, 0 )
          frame = cv2.flip( frame, 1 )
          cv2.imshow("frame", frame)
      
          input=cv2.waitKey(20)
          if input==ord('q'):#如过输入的是q就break,结束图像显示,鼠标点击视频画面输入字符
              break
      
      cap.release()#释放摄像头
      cv2.destroyAllWindows()#销毁窗口
    4. 点击"run"按钮,运行程序,则能够看到图像。

  • 相关阅读:
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第4章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第3章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第1,2章 读书笔记(待更新)
    Tkinter的Message组件
    Git 实操/配置/实践
    mysq5.7.32-win安装步骤
    行为型模式之模板方法
    结构型模式之组合模式
    结构型模式之享元模式
    结构型模式之外观模式
  • 原文地址:https://www.cnblogs.com/ezrealiu/p/install-opencv-4-on-your-raspberry-pi-4.html
Copyright © 2020-2023  润新知