安卓学习笔记-unity调用原生opencv的sdk

问题描述

情况描述:业务需求,在安卓系统上使用人脸检测功能,一开始使用的方案是在unity中直接调用unity资源商店中的插件“opencv-unity.unitypacage”,魔改一下关于人脸检测的脚本就可以用了。实际测试也没有问题
但是,在安卓广告机上使用发现会无缘无故闪退,经过一系列排查,最终确定是因为调用了webcamtexture之类的脚本,调取相机出现异常,导致的闪退
在网上找了两三天的帖子寻求帮助,发现这是安卓主板3588和3568不兼容unity的webcamtexture关于相机的api的脚本,因此在unity中直接使用插件进行人脸检测功能是没有什么可能了。找了技术支持也是提供不了什么解决方案的(想想也知道是个大工程…)

解决思路

那么怎么办呢?

我在排查的过程中发现,调用安卓原生的相机这些api时,这两个主板上是可以正常跑通的。(实际使用过·opencv安卓原生sdk·以及·facedetector·),调用原生相机没问题的话,那么只要将原生调用相机的插件接入到unity中不是就可以了吗?

解决过程

准备工作

为了印证该方案是否可行

  1. 需要确定opencv安卓原生的sdk能正常使用人脸检测功能,并且作为一个aar包被unity调用
  2. 找到人脸检测的代码,在识别到人脸的逻辑中发送消息给unity
  3. unity接收并处理信息(图片数据或图片路径)

opencv安卓原生sdk

在官网上下载安卓原生sdk包(SDK下载地址),然后导入到AndroidStudio中,由于它本身就是一个模块,所以很方便进行调用,在主模块中创建一个activity,继承sdk中的OpencvActivity,然后打包运行,会出现一个显示相机画面的界面,检测到人脸就会自动在人脸的部分绘制一个框框,这和unity的插件效果是一致的,然后打包到安卓主板(3588和3568)上进行测试,也是可以正常检测到的。这一步没问题
tips:需要自行处理gradle版本和compilesdk版本的问题,以及打包过程中可能出现的异常(需要在build.gradle中屏蔽掉一些代码,以及添加一些代码)时间问题就直接贴上来了

apply plugin: 'com.android.library'
apply plugin: 'maven-publish'
//apply plugin: 'kotlin-android'
//apply plugin: 'kotlin-android-extensions'

def openCVersionName = "4.10.0"
def openCVersionCode = ((4 * 100 + 10) * 100 + 0) * 10 + 0

println "OpenCV: " +openCVersionName + " " + project.buildscript.sourceFile

android {
   
//    namespace 'org.opencv'
    compileSdkVersion 31

    defaultConfig {
   
        minSdkVersion 21
        targetSdkVersion 31

        versionCode openCVersionCode
        versionName openCVersionName

        externalNativeBuild {
   
            cmake {
   
                arguments "-DANDROID_STL=c++_shared"
                targets "opencv_jni_shared"
            }
        }
    }

    compileOptions {
   
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    buildTypes {
   
        debug {
   
            packagingOptions {
   
                doNotStrip '**/*.so'  // controlled by OpenCV CMake scripts
            }
        }
        release {
            packagingOptions {
                doNotStrip '**/*.so'  // controlled by OpenCV CMake scripts
            }
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
    lintOptions {
   
        checkReleaseBuilds false
        abortOnError false
    }

//    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 {
   
    implementation files('libs\\unity-classes.jar')

    implementation 'com.android.support:appcompat-v7:28.0.0'
//implementation files('libs\\unity-classes.jar')
}

task CopyPlugin(type: Copy) {
   
    dependsOn assemble
    from('build/outputs/aar')
    into('../../Assets/Plugins/Android')
    include(proje
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淳杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值