• [树莓派(raspberry pi)] 02、PI3安装openCV开发环境做图像识别(详细版)


    前言

    上一篇我们讲了在linux环境下给树莓派安装系统及入门各种资料 ,今天我们更进一步,尝试在PI3上安装openCV开发环境。

    博主在做的过程中主要参考一个国外小哥的文章(见最后链接1),不过其教程中有一个地方稍微有点问题,导致我入坑好久!这里也会着重说明下。

    1、Expand filesystem

    新安装系统之后,首要的工作就是扩大文件系统。因为,用SD卡安装完系统后一大部分空间实际是未被分配的:

    sudo raspi-config

    选择7高级,然后选择“1. Expand File System”,之后点击finish,然后reboot 。

     

    sudo reboot

    之后,你可以用df -h命令确认文件系统是否被扩大:(如下,我的SD卡为闪迪的32G内存卡)

    ➜  ~  df -h
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/root        30G  6.2G   22G  23% /
    devtmpfs        466M     0  466M   0% /dev
    tmpfs           470M     0  470M   0% /dev/shm
    tmpfs           470M  6.4M  464M   2% /run
    tmpfs           5.0M  4.0K  5.0M   1% /run/lock
    tmpfs           470M     0  470M   0% /sys/fs/cgroup
    /dev/mmcblk0p1   41M   21M   21M  51% /boot
    tmpfs            94M     0   94M   0% /run/user/1000

    2、Install dependencies

    接下来是安装openCV的依赖,下面步骤有点多,大家千万别漏了其中一两个(我操作的时候就把ibjpeg-dev libtiff5-dev libjasper-dev libpng12-dev给忘了,结果又得花几个小时重新编译一遍!!!)

    2.1 更新

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

    2.2 安装CMake等编译openCV源码的工具

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

    2.3 安装几种常见格式的图像操作的包,方便我们能从硬盘上读取不同格式的图像(有个同学建议下面的libpng12-dev和后面的gtk2.0会冲突,改成libpng-dev就合适,如果改成libpng-dev,系统好像是会自动匹配版本。由于太忙没有验证,先贴这里,供大家参考选择

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

    2.4  同样的,我们也需要视频操作的包

    $ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
    $ sudo apt-get install libxvidcore-dev libx264-dev

    2.5 openCV用于图像/GUI展示的功能依赖highgui模块,为了编译highgui,我们需要安装GTK development library

    $ sudo apt-get install libgtk2.0-dev

    2.6 安装额外的一些依赖

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

    ^-^ 记得看一下上面几个安装过程有没有少哦

    2.7 接下来还需要安装python dev

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

    3、Download the OpenCV source code

    下载并解压3.1.0版本的源码:

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

    为了安装完整的openCV3,体验新的features,还需要下载并解压 opencv_contrib(注意和opencv版本保持一致):

    $ wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.1.0.zip
    $ unzip opencv_contrib.zip

    4、准备python环境

    4.1 安装python包管理器:

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

    4.2 安装python虚拟环境virtualenv virtualenvwrapper

    首先说明下为什么要装这两个包:

    First, it’s important to understand that a virtual environment is a special tool used to keep the dependencies required by different projects in separate places by creating isolated, independent Python environments for each of them.

    In short, it solves the “Project X depends on version 1.x, but Project Y needs 4.x” dilemma. It also keeps your global site-packages  neat, tidy, and free from clutter.

    If you would like a full explanation on why Python virtual environments are good practice, absolutely give this excellent blog post on RealPython a read.

    用虚拟开发环境可以为每个工程提供独立的python开发环境、独立的包、独立的版本,每个独立的环境会在~/.virtualenvs/下形成资源包~

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

    之后在~/.profile文件最后添加下面几行:

    # virtualenv and virtualenvwrapper
    export WORKON_HOME=$HOME/.virtualenvs
    source /usr/local/bin/virtualenvwrapper.sh

    之后如果想用python虚拟环境,在每次打开一个新的terminal就要执行一次source ~/.profile

    $ source ~/.profile

    接下来我们生成一个python虚拟环境来用于opencv的开发提供环境:(这里不讲python2,强烈建议用python3)

    $ mkvirtualenv cv -p python3

    注:再次说明python虚拟环境是完全独立的,也就是说在cv的环境下安装的python包,步适用于全局;在全局安装的包,不适合cv。

    如何验证你如何将cv环境生成好了呢?——新开一个terminal,执行下列命令:

    $ source ~/.profile
    $ workon cv

    如果terminal前面的文字变成了(cv)表明成功创建了名为cv的python虚拟环境:

    4.3 在cv虚拟环境下安装numpy

    在接下来的操作中都要保持在cv环境中!

    (cv) -> ~ $ pip install numpy

    5、编译和安装openCV

    5.1 编译前的准备

    首先确定是在cv虚拟环境中,如果不在,可以执行:

    $ source ~/.profile
    $ workon cv

    接下来用cmake进行编译opencv:

    注:这一步参考链接1的介绍中缺少一个编译选项,导致总是make出错:(当其出错时,按照下面的方法进行尝试:)

    make -j4 总是报错:
    解决方法:删除build下的所有东西(cmake产生的和make -j4产生的),重新cmake,多加一个下面的选项
    反思:之前一直复制网上的,结果网上坑爹把-D和后面单词连到一块结果还是不成功,导致走了好多弯路。之后做事情前要分析原因(为什么,然后再去尝试,不要根据结果来反馈尝试的对错!!!这样可能会走弯路!!!) 

    link:http://answers.opencv.org/question/116926/ubuntu-1610-opencv-build-fails-stdlibh-missing/
    - 直接采用ubuntu中opencv的安装方法会报QT缺少的错误:http://www.samontab.com/web/2014/06/installing-opencv-2-4-9-in-ubuntu-14-04-lts/
     
    $ cd ~/opencv-3.1.0/
    $ mkdir build
    $ cd build
    $ cmake -D ENABLE_PRECOMPILED_HEADERS=OFF 
    -D CMAKE_BUILD_TYPE=RELEASE 
        -D CMAKE_INSTALL_PREFIX=/usr/local 
        -D INSTALL_PYTHON_EXAMPLES=ON 
        -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.1.0/modules 
        -D BUILD_EXAMPLES=ON ..

    cmake结束之后,会出现下图所示:(当时忘了截图了,盗用别人的一张 ^-^ )

    请仔细校对下python3栏的Interpreter的python虚拟环境的路径,numpy指向python虚拟环境下的numpy安装路径等...

    5.2 开始编译opencv

    上面准备好了一切,只等make了!请再次确保您在cv虚拟环境中:

    $ make -j4

    编译过程大概会用2~3个小时!-j4是采用4线程编译,如果采用4线程编译出现问题请采用单线程编译:

    $ make clean
    $ make

    编译结束后会出现下图所示(也没有留截图,直接盗别人的图):

    5.3 安装opencv

    接下来就只需要几个简单的命令就能安装了:

    $ sudo make install
    $ sudo ldconfig

    6、pi3安装opencv3收尾工作

    接下来做一点收尾工作,然后就能用你的PI开发图像识别的项目了!

    opencv编译好之后就可以make install安装了,编译是通用的,install是将相应的模块、DEMO放到相应的文件夹内;

    下面几步主要是在python虚拟环境中链接到opencv模块:(知其所以然)

    上面当运行完make install之后OpenCV+Python的打包文件将安装在:/usr/local/lib/python3.4/site-packages

    $ ls -l /usr/local/lib/python3.4/site-packages/
    total 1852
    -rw-r--r-- 1 root staff 1895932 Mar 20 21:51 cv2.cpython-34m.so

    我们需要将cv2.cpython-34m.so重命名为cv2.so:

    $ cd /usr/local/lib/python3.4/site-packages/
    $ sudo mv cv2.cpython-34m.so cv2.so

    然后需要将python虚拟环境中的cv2.so链接到上面刚被改名为cv2.so的文件上:

    $ cd ~/.virtualenvs/cv/lib/python3.4/site-packages/
    $ ln -s /usr/local/lib/python3.4/site-packages/cv2.so cv2.so

    7、测试OpenCV3是否安装成功

    进入cv环境,然后调用简单的python指令:

    $ source ~/.profile 
    $ workon cv
    $ python
    >>> import cv2
    >>> cv2.__version__
    '3.1.0'
    >>>

    此时在home目录下还有两个编译、安装opencv时使用的文件夹,理论上可以直接删除掉,但是我建议还是先理解下整个操作流程之后再删掉!

    因为,对opencv源码的编译是需要很长时间的,一旦之后发现有什么问题,可以查看或修改opencv源码来尝试解决问题!

    ➜  ~  ls
    Desktop  Documents  Downloads  get-pip.py  Music  opencv-3.1.0  opencv_contrib-3.1.0  Pictures  Public  python_games  Templates  Videos

    8、跑几个简单的图像识别的DEMO

    编译、安装好之后,其DEMO放在/usr/local/share/OpenVC/sample/python目录下:

    注意:1、运行opencv的DEMO不要在ssh中运行,某些程序是需要GUI的;

         2、opencv的比较多的DEMO都需要摄像头,买不起树莓派自带的贵的,可以淘宝上随便买个20多块钱的免去动USB摄像头;

    由于在usr目录下的DEMO都是只读文件、且其中少了data文件夹(data文件夹是DEMO所需要的一些图片及视频资源),

    如果直接运行的话,会报资源缺少等问题:

    (cv) ➜  python  python houghlines.py
    
    This example illustrates how to use Hough Transform to find lines
    
    Usage:
        houghlines.py [<image_name>]
        image argument defaults to ../data/pic1.png
    
    Traceback (most recent call last):
      File "houghlines.py", line 33, in <module>
        a,b,c = lines.shape
    AttributeError: 'NoneType' object has no attribute 'shape'

    因此,我们将/usr/local/share/OpenVC/sample/文件拷贝到Downloads/sample/,同时从openCV的源码文件中找到data文件夹,并复制到sample目录下:

    cp -r /usr/local/share/OpenCV/samples ~/Downloads/samples 
    cp -r  ~/opencv-3.1.0/samples/data ~/Downloads/samples/data/
    (cv) ➜  samples  tree -L 1 ~/Downloads/samples 
    /home/pi/Downloads/samples
    ├── data
    └── python

    如下是运行霍夫找直线的DEMO效果:

     kmeans聚类算法:(cv) ➜  python  python kmeans.py     

     

    边缘检测算法:(cv) ➜  python  python edge.py

    模式识别算法:(cv) ➜ python python find_obj.py

     运动方向检测,光流算法:(cv) ➜  python  python lk_track.py 

    参考链接

    :: 如果您觉得不错,请推荐给更多人,帮助他们更快地解决实际问题中的坑~


    @beautifulzzzz
    智能硬件、物联网,热爱技术,关注产品
    博客:http://blog.beautifulzzzz.com
    园友交流群:414948975
  • 相关阅读:
    LeetCode
    (六)6.5 Neurons Networks Implements of Sparse Autoencoder
    (六)6.4 Neurons Networks Autoencoders and Sparsity
    (六) 6.3 Neurons Networks Gradient Checking
    opencv::调整图像亮度与对比度
    opencv::两张图片的线性融合
    opencv::源码编译
    日志::spdlog
    std::is_same
    json::rapidjson工具
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/8261688.html
Copyright © 2020-2023  润新知