作者:許哲豪 Jack
前年底(2017 / 12)個人開始了第一個開源項目「OpenQCam」,在這個項目中我整合了最小的樹莓派 Pi Zero W 和一組 SPI 介面 2.2 吋 QVGA(320×240)解析度的 LCD 加上二個實體按鍵與二個 LED,並以 OpenCV(2.4.9)寫了一個簡單的範例,完成了一個簡易型開源相機。
去年底樹莓派推出了最新的 Pi 3 A+、Pi 3 B+ 及 Raspbian(2018–11–13),OpenCV 也推出 4.0(純C++版),並加強深度學習的支援。雖然樹莓派已可支援 Tensoflow(1.9 版以上),解決部份深度學習的推論工作,但遇到傳統電腦視覺與深度學習問題需整合時,OpenCV 或許更為合適,不過可惜的是,目前 OpenCV 在樹莓派上只能使用 CPU ,無法使用 GPU 加速計算。
Pi 3A+ / 4” LCD / HDMI 連結組合(圖片來源:Jack 提供)
最近為了測試這個新的組合,買了 Pi 3A+、Pi 3B+、一組 CSI 介面 500 萬像素攝像頭及一組微雪 4” HDMI (另開新視窗)介面解析度為 800×480 的 LCD(如上圖所示)。為了讓顯示內容更貼近一般產品具有的圖形操作介面(GUI),原本我預計用平常慣用的 QT(C++ 版本)進行程式開發(想說之前有多次舊版的安裝經驗,這次應該三兩下就能搞定工作環境開始寫程式),沒想到又是一波多折。
為了讓大家能順利進入開發環境,接下來就向大家分享踩坑心得,避免重蹈覆轍:
1. 準備一張 16 GB SD 卡,安裝完所有程序後大約剩 3 GB 左右。
2. 到樹莓派官網下載最新版本 Raspbian Stretch with desktop and recommended software 2018-11-23 (另開新視窗),再用 Win32 Disk Imager 將下載到的 Image 燒到 SD 卡。
3. 先不要依微雪 4”LCD 安裝步驟修改樹莓派 config.txt,亦不要將樹莓派和 LCD HDMI 連接在一起,而是用 HDMI 纜線接到一台正常的 HDMI 螢幕(1280×720 以上)或具有 HDMI 的電視上。這樣是為了方便後續遠端 VNC 操作時畫面不會太小。
4. 一般 Pi 3 都會要求使用 5 V 3 A 的變壓器供電,但使用 2 A 的變壓器還是能開機且能正常工作,只是開機後畫面右上方會出現一個黃色閃電符號,這表示供給電壓不足。
5. 將 SD 插入樹莓派,開機後會自動要求設定無線網路、語系、時區等基本設定,最後還會詢問是否更新系統,選擇「是」後視網路狀況大約等十到二十分鐘進行更新系統(這比以前要自己逐一設定方便許多)。
6. 更新完後先不急著重新開機,先到主選單/Preference/Raspberry Pi Configuration 下 Interfaces 頁面,將 Camera / VNC 致能(Enable)勾選起來,再到 Performance 頁面將 GPU 64 MB 改為 128 MB(建議採用內建的 VNC(RealVNC)不要另外安裝 Tight VNC,以免後續遠端操作 QT 時會有問題)。
7. 進入終端機模式,更新系統相依套件包及固件驅動程式,完成後再重新開機即可。
sudo rpi-update
sudo apt-get update
sudo apt-get upgrade
sudo reboot
以上步驟大致上不會遇到太多問題,接下來要安裝 OpenCV / QT 時就有很多設定順序及相依套件問題;一般若只用到基本的 OpenCV 2.4.9 版搭配 QT 5.x 版時,只需執行下列指令即可。
sudo apt-get install -y libopencv-dev python-opencv
sudo apt-get install -y qt5-default qtcreator
(若要其他版本的 OpenCV 就得自己重新編譯,但不知為何沒人提供預先編好的版本讓人直接下載自動安裝)
8. 為了讓大家方便安裝,可直接到 Github 下載預先整理好的安裝程序 opencv_install.sh,直接執行即可。這裡我們安裝的是 OpenCV 4.0.1, QT 5.7.1, QT Creator 4.2.0版本(./opencv4_qt5_install.sh 或 sudo bash ./opencv4_qt5_install.sh)。
完整安裝內容如下所示:
[learn_more caption=”安裝內容”]
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install -y build-essential cmake unzip pkg-config
sudo apt-get install -y libjpeg-dev libtiff-dev libjasper-dev libpng12-dev
sudo apt-get install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install -y libxvidcore-dev libx264-dev
sudo apt-get install -y libgtk-3-dev
sudo apt-get install -y libcanberra-gtk*
sudo apt-get install -y libatlas-base-dev gfortran
sudo apt-get install -y python3-dev python3-pip
sudo pip3 install numpy scipy
sudo apt-get install -y python-dev python-pip
sudo pip install numpy scipy
sudo apt-get install -y qt5-default
sudo apt-get install -y qtcreator
cd ~
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.0.1.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.0.1.zip
sudo unzip opencv.zip
sudo unzip opencv_contrib.zip
sudo mv opencv-4.0.1 opencv
sudo mv opencv_contrib-4.0.1 opencv_contrib
cd ~/opencv
sudo mkdir build
cd build
sudo 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 WITH_FFMPEG=ON \
-D BUILD_TESTS=OFF \
-D WITH_QT=ON \
-D OPENCV_ENABLE_NONFREE=ON \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D INSTALL_C_EXAMPLES=OFF \
-D BUILD_EXAMPLES=OFF ..
sudo make -j4
sudo make install
sudo ldconfig
sudo apt-get update
[/learn_more]
由於執行需要數小時之久,所以建議準備一個小風扇對著板子吹,以免 CPU 過熱變慢甚至當機。本來只想安裝 Python 3 相關套件,但 OpenCV 編譯(make)到最後時一直報錯,所以只好 python 2 & 3 都安裝;make -j4 則是讓四核心都投入編譯工作,速度會快一些,但有時會遇到撞車問題編譯失敗,此時改用單核心編譯下達 sudo make 即可。
安裝時原本是用 Pi 3A+,因為記憶體只有 512 MB,其中又有 128 MB 與 GPU 共享,所以將 SWAP 空間由 100 MB 加大到 1024 MB,但結果依舊多次編譯失敗,最後只好移至 Pi 3B+ 上重新依上述程序編譯成功後再複製 SD 卡到 Pi 3A+ 上執行其他工作。
9. 完成安裝後可利用 Python 3 簡單測試一下是否成功,在終端機執行下列命令,若成功出現 OpenCV 版本號即完成。
Python3
Import cv2
cv2.__version__
完成所有安裝後,在左上角主選單「軟體開發」下會看到 Qt Creator,點擊後即可進入 QT 開發環境。使用前要先設定編譯工具相關路徑,如下圖所示:
QT 編譯器設定(圖片來源:Jack 提供)
10. 選擇「主選單」─「工具」─「選項」,再選擇左側「建置並執行」,進入右側「Compilers」頁面,選擇「新增」─「GCC」─「C」建立新編譯器,在名稱欄輸入「GCC」,在編譯器路徑輸入「/usr/bin/gcc」。同樣方式再新增一「C++」編譯器設定,名稱「G++」、路徑「/usr/bin/g++」。
11. 接著再切到「Kits」頁面,點選清單中的「桌面」,在下方「Compiler」項目的「C」「C++」點選下拉式選單的「GCC」及「G++」即完成設定。
12. 為了確保攝像頭可以正確工作,須先至終端機下輸入「ls /dev/video0」檢查是否已掛載成功;若沒看到「video0」則執行命令sudo nano /etc/modules-load.d/modules.conf
在最下方加入 bcm2835-v4l2按 Ctrl+X 離開時,按「Y」儲存,再執行「ldconfig」進行系統刷新,此時再查詢一次「ls /dev/video0」,若仍沒看到,請檢查排線是否插好,再重新開機即可。
13. 接著再測試攝像頭是否能正確拍照,可利用內建程式在終端機執行 raspistill -o test.jpg
完成上述程序後,原本以為就可用 QT 快快樂樂寫 OpenCV 程式,沒想到 OpenCV 4 竟然和之前版本設定不同,把原先 include 路徑/opencv 2 搬家了,因此須在 QT 專案檔中(*.pro)修改成下列設定才能正常工作。
LIBS += /usr/local/lib/libopencv_*
INCLUDEPATH += /usr/local/include \
/usr/local/include/opencv4 \
/usr/local/include/opencv4/opencv2
14. OpenCV 對於圖形化介面(GUI)的處理非常弱,所以需要搭配其他如 QT 這類工具才能把輸入及結果影像嵌入程式中,但因各家 GUI 工具對於處理 OpenCV 產生的圖像儲存格式(cv::Mat)轉換方式不同,為方便大家測試,請至 Github 下載完整範例程式專案(另開新視窗),程式附有完成註解。
15. 最後為了能在 4” LCD 上正確顯示,必須依微雪文件指示修改 /boot/config.txt,這個檔案可直接在樹莓派上修改,或者將 SD 卡放到讀卡機插入一般 WINDOWS 或 MAC 電腦上,在根目錄下就可看到此檔案。
16. 另外提醒一下,由於 LCD 解析度只有 800*480,遠端 VNC 執行 QT 時有些內容會被遮擋不好操作,所以建議兩組 config.txt 方便切換有 LCD 和沒有 LCD 時的操作。
寫到這裡大致上坑也填的差不多了,接下來就可把重心放到 OpenCV 的程式開發了,後續有機會再撰文說明 OpenCV 如何整合 DNN 模組完成深度學習的應用,敬請期待!
參考資料:
(本文轉載自歐尼克斯實境互動實驗室(另開新視窗)、原文連結 (另開新視窗);責任編輯:葉佳錚)