OpenCV 是一個很好用的影響處理函數庫,旨在處理實時計算機視覺。裡面有非常多的在影像處理上常用到的工具函數。而 Raspberry Pi 是開始學習 OpenCV 不錯的平台,而且還可以用作價格適中的小型設備。在本文章中,將引導你如何在 Raspberry Pi 上安裝 OpenCV 的完整過程。
事前準備
- Raspberry Pi 1, 2, 3 或 4
- Micro SD Card
- 電源
- 連接上互聯網
- Raspberrry Pi 攝像頭或 USB 網絡攝像頭
安裝 OpenCV 軟件包
由於 OpenCV 在 Raspberry Pi 上面需要安裝許多軟件包,因此請通過下面的步驟安裝它們。
- 更新當前安裝的軟件包
透過下面兩個指令更新當前的軟件包
$ sudo apt update
$ sudo apt upgrate
- 安裝 OpenCV 編譯所需的軟件包
$ sudo apt install cmake build-essential pkg-config git
- 安裝不同圖像和視頻格式的支援軟件包
$ 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
- 安裝 OpenCV 界面所需的軟件包
$ sudo apt install libgtk-3-dev libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
- 安裝提高 OpenCV 運行速度的軟件包
$ sudo apt install libatlas-base-dev liblapacke-dev gfortran
- 安裝 HDF5 軟件包
$ sudo apt install libhdf5-dev libhdf5-103
- 安裝 Python
$ sudo apt install python3-dev python3-pip python3-numpy
準備編譯 OpenCV
- 現在已經安裝好所有 OpenCV 所需要的軟件包,但我們需要做一些前置作業,讓我們可以加快我們的編譯過程。
我們需要暫時增加交換空間 ( swap ) 的大小,以加快我們在 Raspberry Pi 上編譯 OpenCV 的過程。
當設備的物理 RAM 用完時,操作系統將使用 swap。儘管 swap 比 RAM 慢很多,但在某些情況下它仍然很有用。
通過運行以下指令開始修改交換文件配置。
$ sudo nano /etc/dphys-swapfile
- 在此文件中,我們需要找到下面這行
CONF_SWAPSIZE=100
替換成 CONF_SWAPSIZE=2048
將 100MB 的大小加大到 2GB ,方便我們待會進行編譯。
更改後,按 CTRL+ O
然後 Enter
保存,再 CTRL+ X
離開。
- 在更改 swap 文件配置後,我們需要使用以下指令重新啟動其服務。
$ sudo systemctl restart dphys-swapfile
通過重新啟動服務,我們迫使它重新創建 swap 文件。
- 然後,讓我們將所需的兩個 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
- 首先,在剛剛克隆的“ opencv ”文件夾中創建一個名為“ build ”的目錄,然後將工作目錄更改為該目錄。
$ mkdir ~/opencv/build
$ cd ~/opencv/build
在此文件夾中,我們將在您的Raspberry Pi上編譯OpenCV。
- 現在我們位於新創建的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 ..
- make 文件成功完成生成後,我們現在可以通過運行以下指令最終繼續編譯 OpenCV。
我們使用參數 -j$(nproc)
來告訴編譯器為每個可用處理器運行編譯器。
這樣做將大大加快編譯過程,並使Raspberry Pi上的每個內核都可以編譯OpenCV。
$ make -j$(nproc)
請注意,編譯過程可能會花費大量時間。在我的 Raspberry Pi 4 上,此過程耗時約1個小時。
- 編譯過程完成後,我們可以繼續安裝 OpenCV。
需要您運行以下指令。
$ sudo make install
此指令將自動將所有必需的文件複製到所需的位置。
- 現在,我們還需要重新生成操作系統庫鏈接緩存。
如果不運行以下命令,Raspberry Pi將無法找到我們的OpenCV安裝。
$ sudo ldconfig
編譯後的清理
- 現在我們已經完成了 OpenCV 的編譯,我們不再需要這麼大的 swap 。
讓我們再次使用以下命令編輯交換文件配置。
$ sudo nano /etc/dphys-swapfile
- 在此文件中,您需要查找並更改以下行。
CONF_SWAPSIZE=2048
替換成 CONF_SWAPSIZE=100
更改後,按 CTRL+ O
然後 Enter
保存,再 CTRL+ X
離開。
- 現在,我們的最終清理任務要求我們重新啟動 swap 服務。
重新啟動服務會將文件大小從 2GB 減小到100 MB。
$ sudo systemctl restart dphys-swapfile
在 Raspberry Pi 上測試 OpenCV
- 要測試現在是否已將OpenCV安裝到我們的Raspberry Pi中,我們將使用Python 3安裝。
通過運行以下命令啟動Python終端。
$ python3
- 在Python中時,我們現在可以使用以下命令導入 OpenCV 模塊。
通過導入模塊,我們可以首先檢查 OpenCV 是否甚至可以在我們的Pi上加載。
>>> import cv2
沒有任何反應代表導入成功
- 現在導入了 OpenCV 模塊,我們應該能夠查詢其版本。
要獲取 OpenCV 的版本,請使用以下命令。
>>> cv2.__version__
- 如果現在一切正常,並且 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
- 參考資料