2019年3月24日 星期日

樹莓派(Pi 3+)安裝OpenCV 4 / QT5填坑心得

前年底(2017/12)個人開始了第一個開源項目「OpenQCam」,在這個項目中整合了最小的樹莓派Pi Zero W和一組SPI介面2.2吋QVGA(320x240)解析度的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加速計算。

Fig. 1 Pi 3A+ / 4” LCD / HDMI連結組合 (點擊圖片放大)




最近為了測試一下這個新的組合於是順手買了Pi 3A+、Pi 3B+、一組CSI介面500萬像素攝像頭及一組微雪4” HDMI介面解析度為800x480的LCD(如Fig. 1所示)。這次為了讓顯示內容更接近一般產品具有圖形操作介面(GUI),所以就預計用平常習慣使用的QT(C++ 版本)來進行程式開發。本想說之前已有很多次舊版安裝經驗,這次應該三兩下就搞定工作環境開始寫程式,沒想到又是一波多折。為了讓大家能順利進入開發環境,接下來就把踩坑心得分享給大家,避免重蹈覆轍。

1.    準備一張16GB SD卡,安裝完所有程序後大約剩3GB左右。

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螢幕(1280x720以上)或具有HDMI的電視上。這樣是為了方便後續遠端VNC操作時畫面不會太小。

4.    一般Pi 3都會要求使用5V 3A的變壓器供電,但使用2A的變壓器還是能開機且能正常工作,只是開機後畫面右上方會出現一個黃色閃電符號,表示供給電壓不足問題。

5.    將SD插入樹莓派,開機後會自動要求設定無線網路、語系、時區等基本設定,最後還會詢問是否更新系統,選擇「是」後視網路狀況大約等十到二十分鐘進行更新系統。這比以前要自己逐一設定要方便多了。

6.    更新完後先不急著重新開機,先到主選單/Preference/Raspberry Pi Configuration下Interfaces 頁面,將Camera / VNC 致能(Enable)勾選起來,再到Performance 頁面將GPU 64MB改為128MB。建議採用內建的VNC (RealVNC)不要另外安裝TightVNC以免後續遠端操作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

完整安裝內容如下所示:

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

由於執行需要數小時之久,所以建議準備一個小風扇對著板子吹,以免CPU過熱變慢甚至當機。另外本來只想安裝Python3相關套件,但OpenCV編譯(make)到最後時一直報錯,所以只好python 2 & 3都安裝。另外make -j4是讓四核心都投入編譯工作,速度會快一些,但有時會遇到撞車問題編譯失敗,此時改用單核心編譯下達sudo make即可。

安裝時原本是用Pi 3A+,因為記憶體只有512MB,其中又有128MB和GPU共享,所以將SWAP空間由100MB加大到1024MB,但結果依舊多次編譯失敗,最後只好移至Pi 3B+上重新依上述程序編譯成功後再複製SD卡到Pi 3A+上執行其它工作。

9.    完成安裝後可利用Python3簡單測試一下是否成功,在終端機執行下列命令,若成功出現OpenCV版本號即完成。

Python3
Import cv2
cv2.__version__

完成所有安裝後,在左上角主選單「軟體開發」下會看到Qt Creator,點擊後即可進入QT開發環境。使用前要設定編譯工具相關路徑(如Fig. 2所示)。

Fig. 2 QT編譯器設定 (點擊圖片放大)


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程式,沒想到OpenCV4竟然和之前版本設定不同,把原先include路徑/opencv2搬家了,因此須在QT專案檔中(*.pro)需修改成下列設定才能正常工作。

14.    LIBS += /usr/local/lib/libopencv_*
         INCLUDEPATH += /usr/local/include \
                                        /usr/local/include/opencv4 \
                                        /usr/local/include/opencv4/opencv2

15.    OpenCV對於圖形化介面(GUI)處理非常弱,所以需要搭配其它如QT這類工具才能把輸入及結果影像嵌入程式中,但因各家GUI工具對於處理OpenCV產生的圖像存儲格式(cv::Mat)轉換方式不同,為方便大家測試,請至Github下載完整的範例程式專案,程式附有完成註解,這裡就不多作說明了,如有任何問題歡迎留言討論。

16.    最後為了能在4” LCD上正確顯示,必須依微雪文件指示修改/boot/config.txt,這個檔案可直接在樹莓派上修改,或者將SD卡放到讀卡機插入一般WINDOWS或MAC電腦上,在根目錄下就可看到此檔案。

17.    另外提醒一下,由於LCD解析度只有800*480,遠端VNC執行QT時有些內容會被遮擋不好操作,所以建議兩組config.txt方便切換有LCD和沒有LCD時的操作。

寫到這裡大致上坑也填的差不多了,再來就可把重心放到OpenCV的程式開發了,後續有機會再撰文說明OpenCV如何整合DNN模組完成深度學習的應用,敬請期待!

完整安裝程序及範例 https://github.com/OmniXRI/OpenCV4_QT5_Pi3



參考文獻:

[1] 樹莓派官網 https://www.raspberrypi.org/downloads/raspbian/
[2] Install OpenCV 4 on your Raspberry Pi https://www.pyimagesearch.com/2018/09/26/install-opencv-4-on-your-raspberry-pi/
[3] 微雪 4" HDMI LCD http://www.waveshare.net/wiki/4inch_HDMI_LCD


進階閱讀:

OpenCV 4.0千呼萬喚始出來 https://omnixri.blogspot.com/2018/12/opencv-40.html
OpenQCam樹莓派開源迷你相機 https://omnixri.blogspot.com/2017/12/openqcam.html

本文歡迎轉發(貼)及非商業用途使用,若有引用部份文章或圖片時煩請註明出處、作者:「歐尼克斯實境互動工作室 作者:Jack Hsu」及本文網址,謝謝!

2 則留言:

  1. 請問 RPi 3B+ 安裝Python3 3.5.3 及OpenCV 4.1.0, 成功運行dlib 19.17.0,若想改用 C++ 取代 Python3,建議如何安裝 C++ 開發環境 ?

    回覆刪除
  2. 如果只想用OpenCV + Python,那這篇文章就沒什麼用處,因為在python環境下可直接用 pip install opencv-python就完成最新版的OpenCV安裝。這篇文章最主要就是為了解決在樹莓派下同時可使用C++/C/Python版本的OpenCV。步驟9是驗證Python可正常運作,而10~15是驗證C++是否正常工作。所以請依步驟5~8就安裝好開發環境。如果你不是用QT開發,則略過後面步驟,安裝自己習慣的開發工具即可。

    回覆刪除

【頂置】簡報、源碼、系列文快速連結區

常有人反應用手機瀏覽本部落格時常要捲很多頁才能找到系列發文、開源專案、課程及活動簡報,為了方便大家快速查詢,特整理連結如下,敬請參考! Edge AI Taiwan 邊緣智能交流區 全像顯示與互動交流區 台科大(NTUST) 人工智慧與邊緣運算實務 開南大學...