2016年5月23日 星期一

How to install OPENCV in Raspbarry pi 3.(如何在樹梅派上安裝OPENCV)

    這篇來記錄如何安裝OPEVCV 在Raspbarry pi 3 上.

  使用OS :Ubuntu MATE 16.04,請參照前兩篇有關Raspbarry pi 3的安裝.

(1)How to install Ubuntu Mate 16.04 in Raspbarry Pi 3(如何在Raspbarry pi 3安裝Ubuntu 16.04)
http://arbu00.blogspot.tw/2016/05/how-to-install-ubuntu-mate-1604-in.html

(2)How to install SSH,WinSCP and VNC in Raspbarry pi 3(如何在Raspbarry pi 3安裝SSH,WinSCP,VNC)
http://arbu00.blogspot.tw/2016/05/how-to-install-sshwinscp-and-vnc-in.html

   接下來會說明如何安裝OPENCV 以及匯入OPENCV 到Python 3.x 語言上,透過Python
即可以操作OPENCV 的功能.OPENCV原本是Intel 內部的一個計劃專案,主要可以從事影像處裡及辨識,如人臉辨識,也包含了一些機器學習,統計,類神經網路的功能.是一個強大好用的開源API.原本的OPENCV 是由C/C++的開源碼寫成. 底下透過一些方式可以將OPENCV 編譯成一個.so檔.即可以匯入Python 3 語言中使用.最後實作一個範例可以辨識出圖片的紅色區塊並將其圈起來.





底下作法參考原始連結來自Adrian Rosebrock:
http://www.pyimagesearch.com/2015/07/20/install-opencv-3-0-and-python-3-4-on-ubuntu/

基本上以下的做法大概就是使用 Adrian Rosebrock所寫,只是增加一些可能出錯的步驟上多加解釋.

Step 1: 更新必要安裝

以下指令對於linux的使用者應該不陌生,如是第一次執行可能要一段時間.
進行動作前請先確認Raspbarry pi 有連上網路.

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


由於有更新RPi 韌體,所以需要做一次重新開機

$ sudo reboot

底下是安裝必要的編譯器來 compile OpenCV 3.0:

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

底下安裝是用來讀取各種圖片檔

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

底下安裝是用來讀取各種影片檔

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

安裝GTK以便使用OPENCV GUI的功能

$ sudo apt-get install libgtk2.0-dev

底下的安裝是為了最佳化OPENCV 的功能,例如矩陣的運算:

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

Step 2: 安裝虛擬環境



取得PIP for Python 3.PIP是 Python 各種安裝套件的管理程式

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

底下會安裝一個虛擬環境,我們打算把OPENCV及Python3安裝在虛擬環境上
使用 pip3  安裝  virtualenv  還有virtualenvwrapper :

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

在執行pip時,如果遇到以下黃色訊息,除了試著執行sudo rm -rf ~/.cache/pip/ 
也可以試著執行pip install virtualenv virtualenvwrapper 不用sudo試試.




  更新 ~/.bashrc  檔,編輯底下敘述在檔案的最下面 :
 可以用 $ sudo nano ~/.bashrc 去編輯

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

重新在終端機上執行 ~/.bashrc  使剛剛的變更生效

$ source ~/.bashrc
接來創建一個虛擬環境 cv  ,我們會在這個虛擬環境上使用OPENCV及Python3

$ mkvirtualenv cv -p python3

==>這個動作會把 虛擬環境CV 的python 預設為python3


Step 2:  安裝Python (Part 2)


安裝python3.4+,注意如果你想安裝更新的python版本,如python3.5,需要把以下的python3.4-dev
改成python3.5-dev. 

$ sudo apt-get install python3.5-dev

安裝numpy,這個很重要是專門用來處理OPENCV 有關影像圖檔的函式.也可以說這個是用來取代
原本在OPENCV裡的MAT 結構.在python裡我們就是用Numpy 來處理圖檔及矩陣資料.

$ sudo rm -rf ~/.cache/pip/
$ sudo pip install numpy

==>安裝Numpy 會花比較多時間


Step 3:編譯OPENCV並連結到Python3


下載OPENCV 3.0.0 原始碼.

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

下載 opencv_contrib  ,如果OPENCV是3.0.0版本 opencv_contrib就要下載對應的3.0.0版

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

以下命令準備進行編譯OPENCV.

$ cd ~/opencv-3.0.0/
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
 -D CMAKE_INSTALL_PREFIX=/usr/local \
 -D INSTALL_C_EXAMPLES=ON \
 -D INSTALL_PYTHON_EXAMPLES=ON \
 -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.0.0/modules \
 -D BUILD_EXAMPLES=ON ..

這個動作執行完,拉回檢查,應該要有以下訊息如果沒有,可能要回過頭檢查之前pip 相關安裝動作有沒有正確.



底下進行OpenCV 編譯:這裡大概要幾個小時的時間,j4是代表4核心CPU,Raspbarry pi3 是4核心
所以就用j4即可.

$ make -j4


如果OPENCV編譯100%成功後,進行以下命令安裝OPENCV,如果編譯過程有遇到當機情形可以試著重新編譯幾次,他會從上次未編譯完成的地方開始繼續編譯.編譯順利的話至少也要3個小時

底下執行安裝編譯好的OPENCV

$ sudo make install
$ sudo ldconfig


Step 4: Sym-link OpenCV 3.0


如果到這邊都沒問題,應該在目錄/usr/local/lib/python3.5/site-packages/會看到cv2.cpython-35m-arm-linux-gnueabihf.so

cv2.cpython-35m-arm-linux-gnueabihf.so  這個檔名可能會因為所安裝的os 版本而略有不同
請注意換成你所生成的檔名進行下一步.



最後由於我們是在虛擬環境上使用OPENCV ,所以必須sym-link OpenCV 到所產生在/usr/local/lib/python3.5/site-packages/的 cv2.cpython-35m-arm-linux-gnueabihf.so 
並把名稱改成cv2.so. 最終的目的就是為了得到cv2.so

$ cd ~/.virtualenvs/cv/lib/python3.5/site-packages/
$ ln -s /usr/local/lib/python3.5/site-packages/cv2.cpython-35m-arm-linux-gnueabihf.so cv2.so



Step 5: 測試OPENCV in Python3



接著直接利用import 來測試,Python 是不是可以匯入引用OPENCV的API.


$ workon cv
$ python
>>> import cv2
>>> cv2.__version__
'3.0.0'

看到底下的結果,表示一切都成功了



最後利用OPENCV實作一個辨識顏色的功能,在Python 程式裡讀進任一張圖片
它會自動辨識紅色然後圈出紅色的部分.




底下是python3+opencv 3 辨識紅色的原始碼.

##red1,py
# import the necessary packages
import numpy as np
import cv2

# load the games image
image = cv2.imread("1.jpg")

# find the red color game in the image
upper = np.array([65, 65, 255])
lower = np.array([0, 0, 200])
mask = cv2.inRange(image, lower, upper)

# find contours in the masked image and keep the largest one
(_, cnts, _) = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,
 cv2.CHAIN_APPROX_SIMPLE)
c = max(cnts, key=cv2.contourArea)

# approximate the contour
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.05 * peri, True)

# draw a green bounding box surrounding the red game
cv2.drawContours(image, [approx], -1, (0, 255, 0), 4)
cv2.imshow("Image", image)
cv2.waitKey(0)


底下是我應用在阿布拉機上的兩個DEMO程式

第一個是透過攝影機 即時辨認顏色



第二個是透過攝影機 即時辨認人臉,當辨識出人臉會擺出動作說歡迎參觀




加入阿布拉機的3D列印與機器人的FB粉絲團
https://www.facebook.com/arbu00/

Scan QRcode to join FB Fans.