Raspberry Pi 安装 OpenCV

OpenCV 是一個很好用的影響處理函數庫,旨在處理實時計算機視覺。裡面有非常多的在影像處理上常用到的工具函數。而 Raspberry Pi 是開始學習 OpenCV 不錯的平台,而且還可以用作價格適中的小型設備。在本文章中,將引導你如何在 Raspberry Pi 上安裝 OpenCV 的完整過程。

事前準備

  • Raspberry Pi 1, 2, 3 或 4
  • Micro SD Card
  • 電源
  • 連接上互聯網
  • Raspberrry Pi 攝像頭或 USB 網絡攝像頭

安裝 OpenCV 軟件包

由於 OpenCV 在 Raspberry Pi 上面需要安裝許多軟件包,因此請通過下面的步驟安裝它們。

  1. 更新當前安裝的軟件包

透過下面兩個指令更新當前的軟件包

$ sudo apt update
$ sudo apt upgrate
  1. 安裝 OpenCV 編譯所需的軟件包
$ sudo apt install cmake build-essential pkg-config git
  1. 安裝不同圖像和視頻格式的支援軟件包
$ sudo apt install libjpeg-dev libtiff-dev libjasper-dev libpng-dev libwebp-dev libopenexr-dev
$ sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libdc1394-22-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev
  1. 安裝 OpenCV 界面所需的軟件包
$ sudo apt install libgtk-3-dev libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
  1. 安裝提高 OpenCV 運行速度的軟件包
$ sudo apt install libatlas-base-dev liblapacke-dev gfortran
  1. 安裝 HDF5 軟件包
$ sudo apt install libhdf5-dev libhdf5-103
  1. 安裝 Python
$ sudo apt install python3-dev python3-pip python3-numpy

準備編譯 OpenCV

  1. 現在已經安裝好所有 OpenCV 所需要的軟件包,但我們需要做一些前置作業,讓我們可以加快我們的編譯過程。

我們需要暫時增加交換空間 ( swap ) 的大小,以加快我們在 Raspberry Pi 上編譯 OpenCV 的過程。

當設備的物理 RAM 用完時,操作系統將使用 swap。儘管 swap 比 RAM 慢很多,但在某些情況下它仍然很有用。

通過運行以下指令開始修改交換文件配置。

$ sudo nano /etc/dphys-swapfile
  1. 在此文件中,我們需要找到下面這行
CONF_SWAPSIZE=100

替換成 CONF_SWAPSIZE=2048

將 100MB 的大小加大到 2GB ,方便我們待會進行編譯。
更改後,按 CTRL+ O 然後 Enter 保存,再 CTRL+ X 離開。

  1. 在更改 swap 文件配置後,我們需要使用以下指令重新啟動其服務。
$ sudo systemctl restart dphys-swapfile

通過重新啟動服務,我們迫使它重新創建 swap 文件。

  1. 然後,讓我們將所需的兩個 OpenCV 存儲庫克隆到 Raspberry Pi 中。

運行這兩個指令將從其git存儲庫中檢索OpenCV的最新可用版本。

$ git clone https://github.com/opencv/opencv.git
$ git clone https://github.com/opencv/opencv_contrib.git

由於這些存儲庫很大,因此可能需要一些時間才能克隆到您的Raspberry Pi。

在 Raspberry Pi上 編譯 OpenCV

  1. 首先,在剛剛克隆的“ opencv ”文件夾中創建一個名為“ build ”的目錄,然後將工作目錄更改為該目錄。
$ mkdir ~/opencv/build
$ cd ~/opencv/build

在此文件夾中,我們將在您的Raspberry Pi上編譯OpenCV。

  1. 現在我們位於新創建的build文件夾中,現在我們可以 cmake 用來準備 OpenCV 以便在 Raspberry Pi 上進行編譯。

運行以下指令以生成所需的makefile。

$ 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 ..
  1. make 文件成功完成生成後,我們現在可以通過運行以下指令最終繼續編譯 OpenCV。

我們使用參數 -j$(nproc) 來告訴編譯器為每個可用處理器運行編譯器。

這樣做將大大加快編譯過程,並使Raspberry Pi上的每個內核都可以編譯OpenCV。

$ make -j$(nproc)

請注意,編譯過程可能會花費大量時間。在我的 Raspberry Pi 4 上,此過程耗時約1個小時

  1. 編譯過程完成後,我們可以繼續安裝 OpenCV。
    需要您運行以下指令。
$ sudo make install

此指令將自動將所有必需的文件複製到所需的位置。

  1. 現在,我們還需要重新生成操作系統庫鏈接緩存。

如果不運行以下命令,Raspberry Pi將無法找到我們的OpenCV安裝。

$ sudo ldconfig

編譯後的清理

  1. 現在我們已經完成了 OpenCV 的編譯,我們不再需要這麼大的 swap 。

讓我們再次使用以下命令編輯交換文件配置。

$ sudo nano /etc/dphys-swapfile
  1. 在此文件中,您需要查找並更改以下行。
CONF_SWAPSIZE=2048

替換成 CONF_SWAPSIZE=100
更改後,按 CTRL+ O 然後 Enter 保存,再 CTRL+ X 離開。

  1. 現在,我們的最終清理任務要求我們重新啟動 swap 服務。

重新啟動服務會將文件大小從 2GB 減小到100 MB。

$ sudo systemctl restart dphys-swapfile

在 Raspberry Pi 上測試 OpenCV

  1. 要測試現在是否已將OpenCV安裝到我們的Raspberry Pi中,我們將使用Python 3安裝。

通過運行以下命令啟動Python終端。

$ python3
  1. 在Python中時,我們現在可以使用以下命令導入 OpenCV 模塊。

通過導入模塊,我們可以首先檢查 OpenCV 是否甚至可以在我們的Pi上加載。

>>> import cv2

沒有任何反應代表導入成功

  1. 現在導入了 OpenCV 模塊,我們應該能夠查詢其版本。

要獲取 OpenCV 的版本,請使用以下命令。

>>> cv2.__version__
  1. 如果現在一切正常,並且 OpenCV 已成功安裝到您的 Raspberry Pi 中,則您應該在命令行中看到如下所示的文本。
'4.1.1'

根據你安裝的版本不同,顯示的版本號也會不一樣

這樣就代表你已經成功將 OpenCV 安裝在 Raspberry Pi 裡面了。接下來你可以盡情使用 OpenCV 進行各種各樣的開發工作了。


常見問題

import cv2 Error

如果在 python 中 import cv2 之後出現以下錯誤

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.7/dist-packages/cv2/__init__.py", line 3, in <module>
    from .cv2 import *
ImportError: /usr/local/lib/python3.7/dist-packages/cv2/cv2.cpython-37m-arm-linux-gnueabihf.so: undefined symbol: __atomic_fetch_add_8
  • 解決方法:

該方法每次啟動python都需要執行一次

$ sudo find / -type f -name 'atom.so*'
$ LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libatomic.so.1.2.0 python3

執行後再嘗試

>>> import cv2 
>>> print(cv2.__version__) 
4.1.1
  • 參考資料

https://stackoverflow.com/a/58871743