Raspberry Pi 筆記(21):安裝 OpenCV

[2020.02.26 Update]
過去兩年多來,將Raspberry Pi 束諸高閣,專心準備PMP考試,終於在2015/11/17通過了考試;可是一年多來,沒有繼續研究樹莓派的相關功能。直到最近看到幾篇OpenCV的文章,想來試試看如何在Raspberry Pi 上執行影像處理的功能,於是拿出塵封已久的 Pi 2 Model B,繼續研究,看看是否能做出影像辨識等功能。以下是安裝OpenCV的各階段步驟:

階段一:安裝套件
安裝好作業系統後,進行系統更新及升級,並重新開機:
$ sudo rpi-update
$ sudo apt-get update
$ sudo apt-get upgrade

重新啟動Raspberry Pi。重新啟動系統後,安裝一些需要的編譯工具:
$ sudo apt-get install build-essential git cmake pkg-config
安裝影像 I/O 套件,包含JPEG, PNG, TIFF等所需套件,這個套件可以載入各種不同的影像檔案格式,如:JPEG, PNG, TIFF等。
$ sudo apt-get install libjpeg8-dev libtiff5-dev libjasper-dev libpng12-dev
註:安裝時出現以下錯誤:安裝 libtiff5-dev 前,需先安裝 libjpeg-dev

The following packages have unmet dependencies:
 libtiff5-dev : Depends: libjpeg-dev
E: Unable to correct problems, you have held broken packages.

[2020.2.26] 上述安裝改成下一行指令,安裝各圖檔Library
$ sudo apt install libjpeg-dev libtiff-dev libjasper-dev libpng-dev libwebp-dev libopenexr-dev
安裝 video I/O 所需套件,使用OpenCV載入video檔案:
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
$ sudo apt-get install libxvidcore-dev libx264-dev libdc1394-22-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev
安裝 GTK 開發 library,這個 library用在建立使用者介面 (Graphical User Interfaces, GUIs),並可以編譯 OpenCV的  highgui 子模組,才能顯示影像在畫面上。
$ sudo apt-get install libgtk-3-dev libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
各種不同的OpenCV如矩陣運作等的最佳化相依:
$ sudo apt-get install libatlas-base-dev liblapacke-dev gfortran
安裝有關管理分層數據格式(HDF5)的套件:
$ sudo apt install libhdf5-dev libhdf5-103
開始安裝 Python 3 開發工具:
$ sudo apt-get install python3-dev python3-pip python3-numpy

階段二:下載 OpenCV
下載OpenCV 3,2,0版本,並解壓縮。
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.2.0.zip
$ unzip opencv.zip
$ cd opencv
比較好的方式是用 git去下載 opencv 原始碼:
$ git clone https://github.com/opencv/opencv.git
$ git clone https://github.com/opencv/opencv_contrib.git

階段三:安裝設定 Python
[2020.2.26]改用 pi 4的版本,可以不需要安裝虛擬環境,numpy就在上一階段安裝。
安裝 pip :
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py
pip是一個以Python電腦程式語言寫成的軟體包管理系統,他可以安裝和管理軟體包,另外不少的軟體包也可以在「Python軟體包索引」(英語:Python Package Index,簡稱PyPI)中找到。[維基百科]
安裝 virtualenv 及 virtualenvwrapper:
$ sudo pip install virtualenv virtualenvwrapper
$ sudo rm -rf ~/.cache/pip
更新個人的資料檔 ~/.profile,將以下三行加到.profile檔案最後面
# virtualenv and virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
重新載入個人的 .profile
$ source ~/.profile
為 Python 建立一個名為 cv 的虛擬環境
$ mkvirtualenv cv
安裝NumPy
$ pip install numpy
NumPy是Python語言的一個擴充程式庫。支援高階大量的維度陣列與矩陣運算,此外也針對陣列運算提供大量的數學函式函式庫。NumPy的前身Numeric最早是由Jim Hugunin與其它協作者共同開發,2005年,Travis Oliphant在Numeric中結合了另一個同性質的程式庫Numarray的特色,並加入了其它擴充功能而開發了NumPy。NumPy為開放原始碼並且由許多協作者共同維護開發。[維基百科]
我們可以暫時增加交換空間的大小,以幫助在 Pi 編譯 OpenCV 時可以加快速度,當 Pi 的實體RAM用完時,操作系統將使用交換空間。儘管交換空間比 RAM 慢很多,但在某些情況下它仍然很有用。修改交換檔設定:
$ sudo nano /etc/dphys-swapfile
找到以下這行:
CONF_SWAPSIZE=100
將數值改成 2048:
CONF_SWAPSIZE=2048
更改後,按  Ctrl  +   X  ,  Y  然後按,保存文件  Enter  。

階段四:編譯並安裝 OpenCV
設定環境:如果有重新啟動系統、Logout或開啟新的終端機,就需要再執行以下指令,來啟動虛擬環境。
$ workon cv
建立編譯程式環境:
$ cd ~/opencv/
$ mkdir build
$ cd build
$ 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=OFF \
    -D INSTALL_PYTHON_EXAMPLES=OFF \
    -D OPENCV_ENABLE_NONFREE=ON \
    -D CMAKE_SHARED_LINKER_FLAGS=-latomic \
    -D BUILD_EXAMPLES=OFF ..
開始編譯 OpenCV:
$ make -j$(nproc)
參數 -j$(nproc) 表示在編譯OpenCV階段使用Raspberry Pi 2(或Pi 4)的最大核心處理器,以加快編譯速度。
註:筆者只要使用 -j$(nproc) 這個參數,系統就會重新啟動,懷疑是因為 overclock的關係,關掉overclock之後,結果還是一樣,一執行就會重開機。還是使用不加參數的指令完成整個編譯工作,這個步驟大約需要 3小時,請耐心等待。
註2:我新購的 Pi 4 在編譯過程大約需要一個小時才能完成。
$ sudo make install

階段五:結束安裝
如果編譯階段沒有錯誤,OpenCV會安裝在 /usr/local/lib/python2.7/site-packages 目錄內,產生一個 cv2.so 的檔案。最後要將這個檔案建立連結到 cv 的虛擬環境。
$ cd ~/.virtualenvs/cv/lib/python2.7/site-packages/
$ ln -s /usr/local/lib/python2.7/site-packages/cv2.so cv2.so

步驟六:確認是否已安裝完成
如果要確認 OpenCV安裝完成,可重新登入或開啟新的終端機,輸入以下指令:
$ workon cv
$ python
>>> import cv2
>>> cv2.__version__
'3.2.0'

如果正確出現OpenCV的版本,就表示安裝成功。


[參考資料]


24 留言

  1. (cv) pi@raspberrypi:~/opencv-3.2.0/build $ cmake -D CMAKE_BUILD_TYPE=RELEASE
    CMake Error: The source directory "/home/pi/opencv-3.2.0/build/CMAKE_BUILD_TYPE= RELEASE" does not exist.
    Specify --help for usage, or press the help button on the CMake GUI.
    到建立編譯程式環境時出現error

    回覆刪除
    回覆
    1. 己解決,要在後面加 \

      刪除
    2. 應該是將指令貼到Blog時漏掉了,謝謝指正!!

      刪除
  2. 我照上面做,但我的 cv2.so 出現在 ~/opencv-3.2.0/build/lib/ 底下
    有需要的朋友可參考~

    回覆刪除
  3. 請問 $ sudo apt-get install libjpeg8-dev libtiff5-dev libjasper-dev libpng12-dev
    出現問題 unable to locate package libjasper
    該怎麼解決

    回覆刪除
    回覆
    1. sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev

      刪除
  4. 請問$ sudo apt-get install build-essential git cmake pkg-config
    抓不到這個套件
    我發現很多套件也都會抓不到
    該怎麼解決

    回覆刪除
    回覆
    1. 不知您有沒有先執行以下幾行更新系統指令,執行後再試一下。
      $ sudo rpi-update
      $ sudo apt-get update
      $ sudo apt-get upgrade

      刪除
  5. 執行pip install numpy會跑很久都沒完成請問問題是?

    回覆刪除
  6. 我重開機後輸入workon cv底下都會顯示
    bash: workon:命令找不到
    每次都要先輸入$ source ~/.profile
    再輸入workon cv
    才能正確運行
    請問這樣是正常的嗎?

    回覆刪除
    回覆
    1. 不正常, 我安裝好OpenCV後,不會出現你所說的情況,建議重新建立SD卡映像檔試看看。

      刪除
  7. 請問更新個人的資料檔 ~/.profile,將以下三行加到.profile檔案最後面 這步驟能講的詳細ㄧ點嗎?剛買幾天不知怎麼使用����

    回覆刪除
    回覆
    1. 你可以用文字編輯器nano開啟.profile:
      $ nano .profile
      開啟後將那三行複製到nano編輯器貼上,按下Ctrl + X 離開時,按 Y存檔即可。

      刪除
  8. 請問階段四那邊輸入mkdir build時,它跑出的結果是cannot create directory 'build' :File exists 要如何解決?

    回覆刪除
  9. 請問最後的步驟出現這行No module named cv2時該怎麼解決呢?

    回覆刪除
  10. 作者已經移除這則留言。

    回覆刪除
  11. 在執行make -j4時出現了[ 18%]Built target opencv_test_flann_pch_dephelp
    Makefile:160: recipe for target 'all' failed
    make: *** [all] Error 2請問要如何解決?

    回覆刪除
  12. 樓主您好 我有個好奇一問,請問你的教學跟指令
    sudo apt-get install python-opencv
    是一樣的嗎?

    回覆刪除
  13. 請問在載openCV時sourceforge.net都連線不到怎麼辦?

    回覆刪除
  14. 請問在打 mkvirtualenv cv 時,出現
    ERROR: Environment '/home/pi/.virtualenvs/cv' does not contain an activate script.
    要怎麼解決?
    謝謝~

    回覆刪除
    回覆
    1. 不確定是哪裡的問題,可以試看看將以下幾行加在~/.profile內,重新開機或重新載入profile試看看。
      export WORKON_HOME=$HOME/.virtualenvs
      export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
      export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv
      source /usr/local/bin/virtualenvwrapper.sh
      export VIRTUALENVWRAPPER_ENV_BIN_DIR=bin

      刪除
    2. 請問一下你說的加在~/.profile是指sudo rm -rf ~/.cache/pip這一行嘛?還需要另外那三行嘛

      刪除
  15. 樓主你好
    我有問題想請教一下
    當我輸入
    sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
    總會出現
    有些套件無法安裝。這可能意謂著您的要求難以解決,或是若您使用的是
    unstable 發行版,可能有些必要的套件尚未建立,或是被移出 Incoming 了。
    以下的資訊或許有助於解決當前的情況:

    下列的套件有未滿足的相依關係:
    libavcodec-dev : 相依關係: libavcodec58 (= 7:4.1.4-1~deb10u1)
    相依關係: libavutil-dev (= 7:4.1.4-1~deb10u1) 但它卻將不會被安裝
    相依關係: libswresample-dev (= 7:4.1.4-1~deb10u1) 但它卻將不會被安裝
    libavformat-dev : 相依關係: libavformat58 (= 7:4.1.4-1~deb10u1) 但 7:4.1.4-1+rpt7~deb10u1 卻將被安裝
    相依關係: libavutil-dev (= 7:4.1.4-1~deb10u1) 但它卻將不會被安裝
    相依關係: libswresample-dev (= 7:4.1.4-1~deb10u1) 但它卻將不會被安裝
    libswscale-dev : 相依關係: libavutil-dev (= 7:4.1.4-1~deb10u1) 但它卻將不會被安裝
    相依關係: libswscale5 (= 7:4.1.4-1~deb10u1) 但 7:4.1.4-1+rpt7~deb10u1 卻將被安裝
    E: 無法修正問題,您保留 (hold) 了損毀的套件。
    請問這有解決辦法嗎

    回覆刪除
  16. 請問我在輸入 make -j4的時候出現
    make: No targets specified and no makefile found. Stop
    該怎麼處理

    回覆刪除

張貼留言

較新的 較舊