[樹莓派(raspberry pi)] 0二、PI3安裝openCV開發環境作圖像識別(詳細版)

 

前言

上一篇咱們講了在linux環境下給樹莓派安裝系統及入門各類資料 ,今天咱們更進一步,嘗試在PI3上安裝openCV開發環境。html

博主在作的過程當中主要參考一個國外小哥的文章(見最後連接1),不過其教程中有一個地方稍微有點問題,致使我入坑很久!這裏也會着重說明下。python

 

一、Expand filesystem

新安裝系統以後,首要的工做就是擴大文件系統。由於,用SD卡安裝完系統後一大部分空間實際是未被分配的:linux

sudo raspi-config

選擇7高級,而後選擇「1. Expand File System」,以後點擊finish,而後reboot 。git

 

sudo reboot

以後,你能夠用df -h命令確認文件系統是否被擴大:(以下,個人SD卡爲閃迪的32G內存卡)github

➜  ~  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

 

二、Install dependencies

接下來是安裝openCV的依賴,下面步驟有點多,你們千萬別漏了其中一兩個(我操做的時候就把ibjpeg-dev libtiff5-dev libjasper-dev libpng12-dev給忘了,結果又得花幾個小時從新編譯一遍!!!)web

2.1 更新算法

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

2.2 安裝CMake等編譯openCV源碼的工具bootstrap

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

2.3 安裝幾種常見格式的圖像操做的包,方便咱們能從硬盤上讀取不一樣格式的圖像(有個同窗建議下面的libpng12-dev和後面的gtk2.0會衝突,改爲libpng-dev就合適,若是改爲libpng-dev,系統好像是會自動匹配版本。因爲太忙沒有驗證,先貼這裏,供你們參考選擇ubuntu

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

2.4  一樣的,咱們也須要視頻操做的包app

$ 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

 

三、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

 

四、準備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

 

五、編譯和安裝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

 

六、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

 

七、測試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

 

八、跑幾個簡單的圖像識別的DEMO

編譯、安裝好以後,其DEMO放在/usr/local/share/OpenVC/sample/python目錄下:

注意:一、運行opencv的DEMO不要在ssh中運行,某些程序是須要GUI的;

     二、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
相關文章
相關標籤/搜索