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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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