前言
上一篇我們講了在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 466M0 466M 0% /dev
tmpfs 470M0 470M 0% /dev/shm
tmpfs 470M6.4M 464M 2% /run
tmpfs5.0M 4.0K 5.0M 1% /run/lock
tmpfs 470M0 470M 0% /sys/fs/cgroup/dev/mmcblk0p1 41M 21M 21M 51% /boot
tmpfs 94M0 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 installvirtualenv 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和後面單詞連到一塊結果還是不成功,導緻走了好多彎路。之後做事情前要分析原因(為什麼,然後再去嘗試,不要根據結果來回報嘗試的對錯!!!這樣可能會走彎路!!!)
$ cd ~/opencv-3.1.0/$mkdirbuild
$ 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線程編譯出現問題請采用單線程編譯:
$ makeclean
$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/total1852
-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源碼來嘗試解決問題!
➜ ~ lsDesktop Documents Downloads get-pip.py Music opencv-3.1.0 opencv_contrib-3.1.0Pictures 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 tofindlines
Usage:
houghlines.py []
image argument defaults to ../data/pic1.png
Traceback (most recent calllast):
File"houghlines.py", line 33, in 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/samplescp -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