使用非 Qt 函式庫 (Raspberry Pi toolchain)
在4.2已經有介紹過使用非 Qt 函式庫,這邊會補充如何在 Qt cross compiler 的環境下加入 OpenCV 函式庫。如何使用 Windows 編譯 RPi 的 OpenCV 函式庫可以參考這裡。
Note: 因為 Raspberry Pi 名稱很長,故文章中一律以 RPi 簡稱之。
Qt *.pro 檔設定
打開 *.pro 檔並加入以下兩行程式碼:
INCLUDEPATH += D:/o31/ab/Release/install/include
LIBS += -L$ "D:/o31/ab/Release/install/lib" -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core
與之前介紹不同的地方是在新增 LIBS 的時候,這邊是以 -L$ "<路徑>" -l<函式庫名稱>
新增函式庫。要注意的是 Linux 的函式庫檔案名稱通常都叫做 libXXXX.so,在連接函式庫的時候 (不僅僅侷限在 Qt) 會變成 lXXXX.so。
Raspberry Pi 設定
為了要讓外部函式庫能夠在 RPi 上順利執行,我們必須確認以下兩個 package (ldconfig、pkg-config) 有被正確安裝,嘗試執行以下命令來檢查:
sudo apt-get install ldconfig pkg-config
如果 OpenCV 在編譯過程中有選擇使用 pkg-config,則在編譯好的 OpenCV 裡面會找到 opencv.pc
檔案,如果找不到有可能位於 /usr/lib/pkgconfig
資料夾中,內容如下:
# Package Information for pkg-config
prefix=/usr/local/lib/opencv3
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include
Name: OpenCV
Description: Open Source Computer Vision Library
Version: 3.1.0
Libs: -L${exec_prefix}/lib -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core
Libs.private: -L/usr/lib/arm-linux-gnueabihf -lwebp -lpng -lz -ltiff -ljasper -ljpeg -lImath -lIlmImf -lIex -lHalf -lIlmThread -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lfontconfig -lfreetype -lgthread-2.0 -lglib-2.0 -ldc1394 -lv4l1 -lv4l2 -lavcodec -lavformat -lavutil -lswscale -lavresample -ldl -lm -lpthread -lrt
Cflags: -I${includedir_old} -I${includedir_new}
第三行的 prefix=/usr/local/lib/opencv3
為函式庫在 RPi 中的存放位置,你可以使用 cd
與 ls -l
等指令檢查一下在 opencv.pc
中設定的相關路徑與檔案是否有實際存在在該位置。
pkg-config 設定好後,接下來要設定 ldconfig,ldconfig 讓程式在執行的時候能夠抓到函式庫真正的位置,並且正確地把函式庫讀進記憶體當中。
首先我們先創造一個檔案叫做 opencv.conf:
sudo touch /etc/ld.so.conf/opencv.conf
在該檔案裡面增加 OpenCV 函式庫所在路徑:
sudo nano /etc/ld.so.conf/opencv.conf
/usr/local/lib/opencv3/lib
改寫完後執行以下指令讓 ldconfig 重新設定:
sudo ldconfig -v
執行程式
全部設定完以後,可以嘗試看看在專案中簡單的加入#include "opencv2/opencv.hpp"
並宣告 cv::Mat
,如果能夠在 RPi 中順利打開即完成外部函式庫的設定。