簡介
前兩天剛好更新了4.10, 這里以4.10作為示例進行編譯, Qt版本是Qt6.6.2。
準備OpenCV的Android庫
一. 使用官方編譯好的庫
1. 下載OpenCV android SDK
opencv-4.10.0-android-sdk.zip
2. 解壓縮
官方提供的包含了多個架構的opencv android庫
二. 自行編譯
注意:
本篇只編譯下載的源碼, 并沒有更新擴展, 有需要的話自行下載并按照如下方式設置編譯:
1) 下載最新擴展 opencv_contrib
2) 在cmake-gui中添加值, 如下圖
OPENCV_EXTRA_MODULES_PATH-》PATH-》<opencv_contrib>/modules
1. 下載OpenCV
opencv-4.10.0-windows.exe
下載完畢之后運行, 程序將源碼解壓縮到本地你自己設定的路徑。
2. 編譯
參考 官方OpenCV-Android-SDK編譯
編譯前準備
Qt for Android 編譯套件使用的NDK是25.1.x, 所以后面NDK版本選擇由此而來
1)打開終端 cmd.exe
2) 設置將編譯器環境添加到環境變量
注: 這樣添加只對打開的這個cmd.exe生效
SET PATH=%PATH%;D:\Softwares\Paths\msys64\mingw64\bin
此環境包含mingw32-make.exe, gcc, g++, python3, cmake-gui等編譯所需
-
設置Android環境變量
SET OPENCV_SRC_FOLDER=E:\test\opencv\sources
SET CONTRIB_SRC_FOLDER=E:\test\opencv_contrib-4.x
SET OPENCV_BUILD_FOLDER=E:\test\opencv\sources\build
SET ANDROID_SDK=D:\Softwares\Paths\Android\android-sdk
SET ANDROID_NDK_HOME=D:\Softwares\Paths\Android\android-sdk\ndk\25.1.8937393 -
執行編譯指令
ndk-25.config.py 此次ndk是25版本, 所以選擇這個文件執行 no_samples_build 不需要編譯示例
–extra_modules_path %CONTRIB_SRC_FOLDER%/modules # 如果不需要更新擴展模塊, 去掉這部分
執行:
D:\Softwares\Paths\msys64\mingw64\bin\python3
%OPENCV_SRC_FOLDER%/platforms/android/build_sdk.py
%OPENCV_BUILD_FOLDER% %OPENCV_SRC_FOLDER% --ndk_path
%ANDROID_NDK_HOME% --sdk_path %ANDROID_SDK% --extra_modules_path
%CONTRIB_SRC_FOLDER%/modules --no_samples_build --config
%OPENCV_SRC_FOLDER%/platforms/android/ndk-25.config.py
- 等待編譯完畢
編譯畫面截圖, 編譯中的錯誤解決參考下文“編譯中遇到的錯誤”, 編譯之后安裝路徑如下圖所示:
編譯后目錄支持架構:
三. 編譯中遇到的錯誤
- gradle-7.5.1 下載失敗
解決, 手動下載, 并放到C:\Users\Administrator.gradle\wrapper\dists\gradle-7.5.1-all\1ehga6e77gqps5uk2kc5kf1vc 目錄下
https://services.gradle.org/distributions/gradle-7.5.1-all.zip
提示: ndk-25.config.py文件中有需要的gradle版本,可以提前自己看下環境是否包含
四. 查看編譯參數
使用cmake-gui直觀的查看官方配置文件生成的編譯參數,如下圖:
Qt for Android項目導入OpenCV
Note : .pro或.pri不要寫中文備注,容易出現莫名錯誤
.pro 中添加如下內容
android {# OPENCV_ANDROID=E:/test/opencv/sources/build/OpenCV-android-sdkOPENCV_ANDROID=E:/OpenCV-android-sdk# ANDROID_TARGET_ABIS = armeabi-v7a arm64-v8a x86 x86_64# for(a, ANDROID_TARGET_ABIS) {# android_add_jni_libs.path = $$PWD/libs/$$a# android_add_jni_libs.sources = $$a/libopencv_java4.so# }contains(ANDROID_TARGET_ARCH, armeabi-v7a) {isEmpty(OPENCV_ANDROID) {error("Let OPENCV_ANDROID point to the opencv-android-sdk, recommended: v4.0")}INCLUDEPATH += $$OPENCV_ANDROID/sdk/native/jni/include#OPENCV3RDPARTYLIBS = $$OPENCV_ANDROID/sdk/native/3rdparty/libs/armeabi-v7aOPENCVNATIVESTATICLIBS = $$OPENCV_ANDROID/sdk/native/staticlibs/armeabi-v7aOPENCVNATIVELIBS = $$OPENCV_ANDROID/sdk/native/libs/armeabi-v7aOPENCV3RDPARTYLIBS=$$OPENCV_ANDROID/sdk/native/3rdparty/libs/armeabi-v7aandroid_add_jni_libs.path = $$OPENCVNATIVELIBSandroid_add_jni_libs.sources = $$OPENCVNATIVELIBS/libopencv_java4.soLIBS += \$$OPENCVNATIVESTATICLIBS/libopencv_features2d.a \$$OPENCVNATIVESTATICLIBS/libopencv_flann.a \$$OPENCVNATIVESTATICLIBS/libopencv_gapi.a \$$OPENCVNATIVESTATICLIBS/libopencv_highgui.a \$$OPENCVNATIVESTATICLIBS/libopencv_imgcodecs.a \$$OPENCVNATIVESTATICLIBS/libopencv_imgproc.a \$$OPENCVNATIVESTATICLIBS/libopencv_ml.a \$$OPENCVNATIVESTATICLIBS/libopencv_objdetect.a \$$OPENCVNATIVESTATICLIBS/libopencv_photo.a \$$OPENCVNATIVESTATICLIBS/libopencv_stitching.a \$$OPENCVNATIVESTATICLIBS/libopencv_video.a \$$OPENCVNATIVESTATICLIBS/libopencv_videoio.a \$$OPENCVNATIVESTATICLIBS/libopencv_calib3d.a \$$OPENCVNATIVESTATICLIBS/libopencv_core.a \$$OPENCVNATIVESTATICLIBS/libopencv_dnn.aLIBS += \$$OPENCV3RDPARTYLIBS/libtegra_hal.a \$$OPENCV3RDPARTYLIBS/libade.a \$$OPENCV3RDPARTYLIBS/libcpufeatures.a \$$OPENCV3RDPARTYLIBS/libIlmImf.a \$$OPENCV3RDPARTYLIBS/libittnotify.a \$$OPENCV3RDPARTYLIBS/liblibjpeg-turbo.a \$$OPENCV3RDPARTYLIBS/liblibopenjp2.a \$$OPENCV3RDPARTYLIBS/liblibpng.a \$$OPENCV3RDPARTYLIBS/liblibprotobuf.a \$$OPENCV3RDPARTYLIBS/liblibtiff.a \$$OPENCV3RDPARTYLIBS/liblibwebp.a \$$OPENCV3RDPARTYLIBS/libtbb.a} else {error("Unsupported architecture: $$ANDROID_TARGET_ARCH")}
}
其它
OpenCV 4.10官方文檔
Custom-OpenCV-Android-SDK-and-AAR-package-build
開源Android投屏軟件scrcpy,需要開啟USB調試
OpenCV for android編譯, 需要梯子
OpenCV for android編譯, 需要梯子