OpenCV 4.10.0 移植 - Android

在這里插入圖片描述

前文:

Ubuntu 編譯 OpenCV SDK for Android + Linux
OpenCV 4.10.0 移植

概述

?????在移動應用開發領域,Android平臺與OpenCV庫的結合為開發者提供了強大的圖像處理和計算機視覺能力。OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和機器學習軟件庫,而Android則是全球最流行的移動操作系統之一。兩者的結合使得開發者能夠在移動設備上實現復雜的圖像處理功能,從簡單的濾鏡應用到高級的物體識別和增強現實體驗。

?????Android平臺為OpenCV提供了廣泛的硬件支持和用戶基礎,而OpenCV則為Android開發者提供了豐富的圖像處理算法和工具。這種協同關系使得開發者能夠輕松地將計算機視覺技術集成到移動應用中,無需從零開始實現復雜的圖像處理算法。無論是人臉檢測、二維碼識別、圖像增強還是實時視頻處理,Android與OpenCV的結合都為這些功能提供了可靠的技術基礎。

?????隨著移動設備計算能力的不斷提升,Android+OpenCV的組合正在推動移動端計算機視覺應用的快速發展,為醫療、安防、零售、娛樂等多個行業帶來了創新的解決方案.

針對Ubuntu 編譯 OpenCV SDK for Android + Linux一文:

  1. 彌補缺少java文件輸出
  2. 使用Gradle
  3. 增加示例測試
環境
屬性
OpenJDK11
abiarmeabi-v7a
Android Gradle Plugin Version4.2.2
Gradle Version6.7.1
cmake3.16.3
NDK22.0.7026061

編譯腳本:

注: OpenCV的下載解壓, 前文已有, 不在贅述.

構建的方法有兩種:

  1. 使用python腳本
  2. 使用傳統的make
export ANDROID_HOME=/home/xxxxx/Android/Sdk/
export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/22.0.7026061
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
TOOLCHAINS=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmakewithPython=0output_dir=build-android
if [ ! -d $output_dir ]; thenmkdir $output_dir
fifor arg in $@; doif [ $arg == "clean" ]; thenecho "build with clean"rm -rf $output_dir/*elif [ $arg == "python" ]; thenecho "build via python"withPython=1;fidone## -------------------- ##
cd $output_direcho "START Configure..."
echo "build via python is $withPython"## OK
if [ $withPython == "1" ]; thenpython ../platforms/android/build_sdk.py \--config=../platforms/android/ndk-22.config.py \--ndk_path=$ANDROID_NDK_HOME \--sdk_path=$ANDROID_HOME \--no_ccache \--no_samples_build \. \..
elseabis="armeabi-v7a arm64-v8a"for abi in $abis; doecho "build ABI:$abi"cmake \-D ANDROID_SDK=$ANDROID_HOME \-D ANDROID_NDK=$ANDROID_NDK_HOME \-D CMAKE_ANDROID_NDK=$ANDROID_NDK_HOME \-D CMAKE_TOOLCHAIN_FILE=$TOOLCHAINS \-D ANDROID_TOOLCHAIN='clang'  \-D ANDROID_ABI=$abi \-D ANDROID_STL='c++_shared'  \-D ANDROID_PLATFORM_ID='2'  \-D ANDROID_GRADLE_PLUGIN_VERSION='4.1.2'  \-D GRADLE_VERSION='6.5'  \-D KOTLIN_PLUGIN_VERSION='1.5.10' \-D BUILD_ANDROID_EXAMPLES='OFF' \-D INSTALL_ANDROID_EXAMPLES='OFF' \-D BUILD_DOCS='OFF' \-D WITH_OPENCL='OFF' \-D WITH_CUDA=OFF \-D WITH_MATLAB=OFF \-D BUILD_EXAMPLES=OFF \-D BUILD_PERF_TESTS=OFF \-D BUILD_TESTS=OFF \-D WITH_TBB='OFF'  \-D INSTALL_TESTS='OFF'  \-D INSTALL_CREATE_DISTRIB='OFF'  \-D BUILD_KOTLIN_EXTENSIONS='OFF' \..#ninja opencv_modulesmake -j12make installdone
fiecho "--END--"## reference
# OpenJDK 11
#     -D BUILD_ANDROID_PROJECTS=ON : 才能編譯出JAVA#     -D BUILD_SHARED_LIBS=ON 編譯出so庫#  CMake Error at /usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
#    Could NOT find OpenCV (missing: opencv_java) (found version "4.10.0")
#  Call Stack (most recent call first):
#    /usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)
#    /media/xxxxx/codes/opencv-4.10.0/build-android/OpenCVConfig.cmake:367 (find_package_handle_standard_args)
#    CMakeLists.txt:15 (find_package)# 好戲上演:為Android項目編譯OpenCV 4.1.0,可按需編譯模塊,大大減少空間。
# https://juejin.cn/post/7225511164125610021# https://zj-image-processing.readthedocs.io/zh-cn/latest/opencv/install-configure/[OpenCV_Contrib-4.0.1]%E7%BC%96%E8%AF%91OpenCV4Android/

編譯輸出:

opencv-4.10.0/build-android/install/sdk$ ll
total 40
drwxrwxr-x 8 xxxxx xxxxx 4096 7月   8 15:32 ./
drwxrwxr-x 4 xxxxx xxxxx 4096 7月   8 13:47 ../
drwxrwxr-x 7 xxxxx xxxxx 4096 7月   8 15:32 build/
-rw-r--r-- 1 xxxxx xxxxx 5628 7月   8 15:27 build.gradle
drwxrwxr-x 3 xxxxx xxxxx 4096 7月   8 15:32 .cxx/
drwxrwxr-x 5 xxxxx xxxxx 4096 7月   8 13:47 etc/
drwxrwxr-x 4 xxxxx xxxxx 4096 7月   8 14:58 java/
drwxrwxr-x 2 xxxxx xxxxx 4096 7月   8 14:58 libcxx_helper/
drwxrwxr-x 6 xxxxx xxxxx 4096 7月   8 13:47 native/

導入到AndroidStudio

  1. settings.gradle 增加OpenCV模塊
include ':opencv-4.10'
project(':opencv-4.10').projectDir = new File("opencv-4.10.0/build-android/install/sdk")
  1. app模塊增加依賴

build.gradle

apply plugin: 'com.android.application'
android {defaultConfig {//省略app信息externalNativeBuild{ndk{abiFilters 'armeabi-v7a'}}}
}
dependencies {implementation project(':opencv-4.10')
}
  1. 導入OpenCV出錯, 參照下文注釋部分配置:
// This file is part of OpenCV project.
// It is subject to the license terms in the LICENSE file found in the top-level directory
// of this distribution and at http://opencv.org/license.html.//
// Notes about integration OpenCV into existed Android Studio application project are below (application 'app' module should exist).
//
// This file is located in <OpenCV-android-sdk>/sdk directory (near 'etc', 'java', 'native' subdirectories)
//
// Add module into Android Studio application project:
//
// - Android Studio way:
//   (will copy almost all OpenCV Android SDK into your project, ~200Mb)
//
//   Import module: Menu -> "File" -> "New" -> "Module" -> "Import Gradle project":
//   Source directory: select this "sdk" directory
//   Module name: ":opencv"
//
// - or attach library module from OpenCV Android SDK
//   (without copying into application project directory, allow to share the same module between projects)
//
//   Edit "settings.gradle" and add these lines:
//
//   def opencvsdk='<path_to_opencv_android_sdk_rootdir>'
//   // You can put declaration above into gradle.properties file instead (including file in HOME directory),
//   // but without 'def' and apostrophe symbols ('): opencvsdk=<path_to_opencv_android_sdk_rootdir>
//   include ':opencv'
//   project(':opencv').projectDir = new File(opencvsdk + '/sdk')
//
//
//
// Add dependency into application module:
//
// - Android Studio way:
//   "Open Module Settings" (F4) -> "Dependencies" tab
//
// - or add "project(':opencv')" dependency into app/build.gradle:
//
//   dependencies {
//       implementation fileTree(dir: 'libs', include: ['*.jar'])
//       ...
//       implementation project(':opencv')
//   }
//
//
//
// Load OpenCV native library before using:
//
// - avoid using of "OpenCVLoader.initAsync()" approach - it is deprecated
//   It may load library with different version (from OpenCV Android Manager, which is installed separatelly on device)
//
// - use "System.loadLibrary("opencv_java4")" or "OpenCVLoader.initDebug()"
//   TODO: Add accurate API to load OpenCV native library
//
//
//
// Native C++ support (necessary to use OpenCV in native code of application only):
//
// - Use find_package() in app/CMakeLists.txt:
//
//   find_package(OpenCV 4.10 REQUIRED java)
//   ...
//   target_link_libraries(native-lib ${OpenCV_LIBRARIES})
//
// - Add "OpenCV_DIR" and enable C++ exceptions/RTTI support via app/build.gradle
//   Documentation about CMake options: https://developer.android.com/ndk/guides/cmake.html
//
//   defaultConfig {
//       ...
//       externalNativeBuild {
//           cmake {
//               cppFlags "-std=c++11 -frtti -fexceptions"
//               arguments "-DOpenCV_DIR=" + opencvsdk + "/sdk/native/jni" // , "-DANDROID_ARM_NEON=TRUE"
//           }
//       }
//   }
//
// - (optional) Limit/filter ABIs to build ('android' scope of 'app/build.gradle'):
//   Useful information: https://developer.android.com/studio/build/gradle-tips.html (Configure separate APKs per ABI)
//
//   splits {
//       abi {
//           enable true
//           universalApk false
//           reset()
//           include 'armeabi-v7a' // , 'x86', 'x86_64', 'arm64-v8a'
//       }
//   }
//plugins {id 'com.android.library' // or 'com.android.application' if this is an app module
}//apply plugin: 'maven-publish'def openCVersionName = "4.10.0"
def openCVersionCode = ((4 * 100 + 10) * 100 + 0) * 10 + 0println "OpenCV: " +openCVersionName + " " + project.buildscript.sourceFileandroid {compileSdkVersion 31defaultConfig {minSdkVersion 21targetSdkVersion 31versionCode openCVersionCodeversionName openCVersionNameexternalNativeBuild {cmake {arguments "-DANDROID_STL=c++_shared"targets "opencv_jni_shared"}}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}buildTypes {debug {packagingOptions {doNotStrip '**/*.so'  // controlled by OpenCV CMake scripts}}release {packagingOptions {doNotStrip '**/*.so'  // controlled by OpenCV CMake scripts}minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'}}//buildFeatures {//    prefabPublishing true//    buildConfig true//}//prefab {//    opencv_jni_shared {//        headers "native/jni/include"//    }//}sourceSets {main {jniLibs.srcDirs = ['native/libs']java.srcDirs = ['java/src']res.srcDirs = ['java/res']manifest.srcFile 'java/AndroidManifest.xml'}}//publishing {//    singleVariant('release') {//        withSourcesJar()//        withJavadocJar()//    }//}externalNativeBuild {cmake {path (project.projectDir.toString() + '/libcxx_helper/CMakeLists.txt')}}
}//publishing {
//    publications {
//        release(MavenPublication) {
//            groupId = 'org.opencv'
//            artifactId = 'opencv'
//            version = '4.10.0'
//
//            afterEvaluate {
//               from components.release
//           }
//        }
//    }
//    repositories {
//        maven {
//            name = 'myrepo'
//            url = "${project.buildDir}/repo"
//        }
//    }
//}
//
//dependencies {
//}
  1. app 調用:
    public Mat onCameraFrame(Mat inputFrame) {Mat frame = inputFrame;Mat gray = new Mat();Mat edges = new Mat();List<MatOfPoint> contours = new ArrayList<>();// Convert to grayscaleImgproc.cvtColor(frame, gray, Imgproc.COLOR_RGBA2GRAY);// Apply Canny edge detectionImgproc.Canny(gray, edges, 100, 200);// Find contoursImgproc.findContours(edges, contours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);// Draw contours in redScalar redColor = new Scalar(255, 0, 0, 255); // RGBA: RedImgproc.drawContours(frame, contours, -1, redColor, 2);// Release temporary Mats//gray.release();//edges.release();return frame;}

運行效果:
在這里插入圖片描述

一些問題

  • 如果LOG找不到libc++_shared.so

    22.0.7026061/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++_shared.so

    把這個文件拷貝到app的目錄下:

    src/main/jniLibs/armeabi-v7a/libc++_shared.so

完整代碼

OpenCV 4.10.0 移植 - Android 參考調用示例代碼

參考

[Ubuntu 16.04][Anaconda3][OpenCV_Contrib 4.0.1]編譯OpenCV4Android
Ubuntu 編譯 OpenCV SDK for Android + Linux
OpenCV 4.10.0 移植

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88347.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88347.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88347.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

go go go 出發咯 - go web開發入門系列(二) Gin 框架實戰指南

go go go 出發咯 - go web開發入門系列&#xff08;二&#xff09; Gin 框架實戰指南 往期回顧 go go go 出發咯 - go web開發入門系列&#xff08;一&#xff09; helloworld 前言 前一節我們使用了go語言簡單的通過net/http搭建了go web服務&#xff0c;但是僅使用 Go 的標…

編譯OpenHarmony-4.0-Release RK3566 報錯

編譯OpenHarmony-4.0-Release RK3566 報錯1. 報錯問題2.問題解決3.解決方案4.?調試技巧?subsystem name config incorrect in ‘/home/openharmony/OpenHarmony/vendor/kaihong/khdvk_356b/bundle.json’, build file subsystem name is kaihong_products,configured subsy1.…

【PTA數據結構 | C語言版】線性表循環右移

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 給定順序表 A(a1?,a2?,?,an?)&#xff0c;請設計一個時間和空間上盡可能高效的算法將該線性表循環右移指定的 m 位。例如&#xff0c;(1,2,5,7,3,4,6,8) 循環右移 3 位&#xff08;m3) 后的結果…

c++-內部類

概念如果一個類定義在另一個類的內部&#xff0c;這個內部類就叫做內部類。內部類是一個獨立的類&#xff0c; 它不屬于外部類。特性1.不能通過外部類的對象去訪問內部類的成員。外部類對內部類沒有任何優越的訪問權限。 2.內部類就是外部類的友元類&#xff0c;參見友元類的定…

.golangci.yml文件配置

version: “2” run: timeout: 5m concurrency: 10 modules-download-mode: readonly linters: default: standard enable: - revive - cyclop settings: staticcheck: initialisms: [ “ACL”, “API”, “ASCII”, “CPU”, “CSS”, “DNS”, “EOF”, “GUID”, “HTML”, …

YOLO模型魔改指南:從原理到實戰,替換Backbone、Neck和Head(戰損版)

前言 Hello&#xff0c;大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名熱愛AI技術的GIS開發者。本系列是作者參加DataWhale 2025年6月份Yolo原理組隊學習的技術筆記文檔&#xff0c;這里整理為博客&#xff0c;希望能幫助Yolo的開發者少走彎路&#xff01; &am…

Swift 圖論實戰:DFS 算法解鎖 LeetCode 323 連通分量個數

文章目錄摘要描述示例題解答案DFS 遍歷每個連通區域Union-Find&#xff08;并查集&#xff09;題解代碼分析&#xff08;Swift 實現&#xff1a;DFS&#xff09;題解代碼詳解構建鄰接表DFS 深度優先搜索遍歷所有節點示例測試及結果示例 1示例 2示例 3時間復雜度分析空間復雜度分…

【劍指offer】棧 隊列

&#x1f4c1; JZ9 用兩個棧實現隊列一個棧in用作進元素&#xff0c;一個棧out用于出元素。當棧out沒有元素時&#xff0c;從in棧獲取數據&#xff0c;根據棧的特性&#xff0c;棧out的top元素一定是先進入的元素&#xff0c;因此當棧out使用pop操作時&#xff0c;一定時滿足隊…

GoView 低代碼數據可視化

純前端 分支&#xff1a; master &#x1f47b; 攜帶 后端 請求分支: master-fetch &#x1f4da; GoView 文檔 地址&#xff1a;https://www.mtruning.club/ 項目純前端-Demo 地址&#xff1a;https://vue.mtruning.club/ 項目帶后端-Demo 地址&#xff1a;https://demo.mtrun…

Spring Boot返回前端Long型丟失精度 后兩位 變成00

文章目錄一、前言二、問題描述2.1、問題背景2.2、問題示例三、解決方法3.1、將ID轉換為字符串3.2、使用JsonSerialize注解3.3、使用JsonFormat注解一、前言 在后端開發中&#xff0c;我們經常會遇到需要將ID作為標識符傳遞給前端的情況。當ID為long類型時&#xff0c;如果該ID…

計算機網絡實驗——無線局域網安全實驗

實驗1. WEP和WPA2-PSK實驗一、實驗目的驗證AP和終端與實現WEP安全機制相關的參數的配置過程。驗證AP和終端與實現WPA2-PSK安全機制相關的參數的配置過程。驗證終端與AP之間建立關聯的過程。驗證關閉端口的重新開啟過程。驗證屬于不同BSS的終端之間的數據傳輸過程。二、實驗任務…

【從零開始學Dify】大模型應用開發平臺Dify本地化部署

目錄Dify一、本地化部署1、安裝docker2、安裝Dify&#xff08;1&#xff09;拉取代碼到本地&#xff08;2&#xff09;docker部署&#xff08;3&#xff09;查看服務狀態&#xff08;4&#xff09;web端部署&#xff08;5&#xff09;登錄二、可能會出現的問題&#xff08;1&am…

LVGL應用和部署(和物理按鍵交互)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】屏幕除了顯示部分&#xff0c;還要去和其他外設進行交互&#xff0c;這是非常重要的一個處理方法。我們知道&#xff0c;不管是mcu&#xff0c;還是…

限流式保護器如何筑牢無人駕駛汽車充電站的安全防線

摘要&#xff1a; 隨著新能源汽車&#xff0c;尤其是無人駕駛車隊的快速發展&#xff0c;充電設施的安全可靠性至關重要。交流充電樁&#xff08;俗稱“慢充樁”&#xff09;作為重要的充電基礎設施&#xff0c;其末端回路的安全保護需滿足國家標準GB51348-2019的嚴格要求&…

專題:2025母嬰行業洞察報告|附60+份報告PDF匯總下載

原文鏈接&#xff1a;https://tecdat.cn/?p42908 全球母嬰市場正經歷結構性增長&#xff0c;一面是歐美成熟市場的品質消費升級&#xff0c;一面是東南亞、中東等新興市場的人口紅利釋放。2020至2026年&#xff0c;全球母嬰市場規模將從1859億美元增至3084億美元&#xff0c;年…

從零搭建多商戶商城系統源碼:技術棧、數據庫設計與接口規劃詳解

如今&#xff0c;多商戶商城系統已成為傳統零售轉型與新型電商平臺構建的關鍵利器。無論是打造像某寶、某東這樣的綜合型平臺&#xff0c;還是服務于垂直行業的獨立電商&#xff0c;一套高效、可擴展的多商戶商城系統源碼&#xff0c;往往決定著平臺的成敗。 今天&#xff0c;小…

在Docker中運行macOS的超方便體驗!

在數字化和開發人員快速迭代的今日&#xff0c;擁有一個便捷、高效的開發環境成為每個開發者夢寐以求的事情。特別是在需要操作多個系統、開發跨平臺應用時&#xff0c;調試和測試的便利性顯得尤為重要。今天為大家介紹的這款開源項目&#xff0c;正是一個解決此類問題的利器—…

Kettle導入Excel文件進數據庫時,數值發生錯誤的一種原因

1、問題描述及原因 在使用kettle讀取Excel文件、并導入數據庫時&#xff0c;需要讀取Excel中的數值、日期(或日期時間、時間)、文本這三種類型的列進來&#xff0c;發現讀取其中的數值時&#xff0c;讀取的數字就不對。 經調查&#xff0c;原因是&#xff0c;在“導出數據為E…

Windows安裝DevEco Studio

1. 概述 DevEco Studio是華為基于IDEA Community開源工具開發的一站式HarmonyOS應用及元服務開發平臺&#xff0c;為開發者提供代碼開發、編譯構建以及調測等功能 2. 運行環境要求 操作系統&#xff1a;Windows10 64位、Windows11 64位 內存&#xff1a;16GB及以上 硬盤&…

PLC框架-1.3.2 報文750控制匯川伺服的轉矩上下限

本文介紹1200PLC如何使用750報文設定伺服轉矩的上下限。 750號報文 PLC---->伺服 (控制) 伺服--->PLC (狀態) PZD1