关于Android端引入OpenCVSDK并运行face-detection示例步骤

由于要做一个Android端人脸检测的功能需要用到OpenCV
通过安装相应版本的SDK后,里面刚好有一个face-detection的示例程序,通过新建项目并将该示例项目下文件移入app/src/main目录下
在这里插入图片描述

目录结构如下:
在这里插入图片描述

再将OpenCVSDK包中的sdk文件夹复制粘贴到项目根目录下并重命名为opencv,在这里插入图片描述
然后在项目根目录下的settings.gradle文件中加入opencv,
在这里插入图片描述
而后再点击gradle出现如下问题,将下述错误提示92行处注释即可在这里插入图片描述
此时再gradle后会显示build成功在这里插入图片描述
但是app/src/main/java目录下之前复制过来的java文件却提示报错,原因是因为虽然opencv的SDK已经引入到项目中,但是当前app中尚未引入OpenCV,引入方式如下

点击右上角project structure(也可点击左上角File-project structure)
在这里插入图片描述
project structure内容如下在这里插入图片描述
ps:没有第三个Module Dependency选项是因为上步settings.gradle文件中没有加入include ‘:opencv’

上述第四步点击完后会出现如下弹框
在这里插入图片描述
点击完OK后当前弹框关闭并重新回到Project Structure界面,点击Apply稍等后点击OK关闭当前窗口,关闭后会自动gradle,此时依然是成功状态
在这里插入图片描述
与此同时上述java文件中的报错也已消息,说明此时SDK引入到app成功
在这里插入图片描述
而后再来尝试运行face-detection示例,
在这里插入图片描述
此时在项目中打开该文件会出现如下问题在这里插入图片描述
这是因为上述文件中第三行package的值并非当前项目,进行如下更改
在这里插入图片描述
更改完成后点击run按钮尝试将当前app发布到设备端,出现如下错误

Manifest merger failed : android:exported needs to be explicitly specified for <activity>. Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details.

在这里插入图片描述
再回到上述AndroidManifest.xml文件中,在activity中添加exported=“true”配置在这里插入图片描述
此时再点击右上角run按钮后成功发布到设备端,但是打开会有闪退现象
在这里插入图片描述
在运行状态下多次点击设备端已安装的app会出现如下错误,提示libdetection_based_tracker.so没找到
在这里插入图片描述
后通过查找资料,有文章说是因为当前调试设备的cpu与配置文件内的cpu型号不一致,导致该so文件找不到,于是通过调试找到当前设备的cpu型号
打开cmd命令窗口,输入adb shell getprop ro.product.cpu.abi命令查看当前调试设备的cpu类型
在这里插入图片描述
然后回到项目中更改jni目录下的Application.mk文件
在这里插入图片描述
更改完成后依然存在上述报错,偶然通过查看Android.mk文件后发现有些配置对于引入的OpenCVSDK文件命名为sdk而非opencv
在这里插入图片描述
ps:此处有两点需要更改,除了更改sdk为opencv外对于第二处路径也需调整,改完后如下
在这里插入图片描述
更改完成后再次gradle后出现如下错误在这里插入图片描述
点击最上方标题,查看完整报错信息
在这里插入图片描述
发现虽然已经将Android.mk文件里的sdk替换为opencv但还是有一些看不见的配置文件中路径为sdk而非自己命名的opencv,于是将引入的SDK包名称改为sdk并将Android.mk中相关配置也改为sdk
在这里插入图片描述
同时将app/build.gradle文件中加入如下配置在这里插入图片描述

android {
    compileSdk 32
    buildToolsVersion "33.0.0"

    defaultConfig {
        ...
        externalNativeBuild {
            cmake {
                arguments "-DOpenCV_DIR=" + project(':sdk').projectDir + "/native/jni",
                        "-DANDROID_TOOLCHAIN=clang",
                        "-DANDROID_STL=c++_shared"
                targets "detection_based_tracker"
            }
        }
    }

    ...
    
    externalNativeBuild {
        cmake {
            path 'src/main/jni/CMakeLists.txt'
        }
    }
}

更改完成后点击gradle后编译成功
在这里插入图片描述
再次点击run按钮将APP发布到设备端,又出现了闪退的问题,同样在运行状态下多次点击后控制台出现错误提示
在这里插入图片描述
进入到jni目录下更改如下文件
在这里插入图片描述
在这里插入图片描述

如下即为上述需要替换的词的由来
在这里插入图片描述
替换前:在这里插入图片描述
替换后:
在这里插入图片描述
以同样方式替换DetectionBasedTracker_jni.h文件,全部替换完成后在点击run按钮将APP重新发布到设备端

在这里插入图片描述
设备端成功打开并检测到人脸信息。

总结:
1、首次使用时由于不熟悉曾查找运行face-detection的相关文章,如下,但是时间都比较久了,因此出现许多(包含AS编辑器、OpenCV、ndk、gradle等)版本语音导致的运行错误
https://www.cnblogs.com/grufield/p/7082130.html#!comments

https://blog.csdn.net/zengxyuyu/article/details/52303659
这是相对操作较完整的两篇文章,但是由于时间太久现在按步骤操作后出现许多问题
如:

java.lang.UnsatisfiedLinkError: dlopen failed: library "libdetection_based_tracker.so" not found

face datection java.lang.UnsatisfiedLinkError: dlopen failed: library "libde

Unable to determine application id: com.android.tools.idea.run.ApkProvisionE...

Cannot resolve external dependency androidx.appcompat:appcompat:1.2.0 becaus...

app\build\intermediates\compile_and_runtime_not_namespaced_r_class_jar\debug...

opencv has leaked window DecorView@c4a9fa4[OpenCV is not ready] that was ori...

Minimum supported Gradle version is 7.0.2. Current version is 6.8.3....

Manifest merger failed : android:exported needs to be explicitly specified f...

Process 'command 'C:\Users\Administrator\Android\ASDK\SDK\ndk\16.1.4479499\ndk-build.cmd'' finished with non-zero exit value 2

face datection java.lang.UnsatisfiedLinkError: dlopen failed: library "libde

OpenCV error: Cannot load info library for OpenCV

java.nio.file.FileSystemException...

face detection error "OpenCV 4.x+ requires enabled C++11 support...

以及安装到设备端后提示缺少OpenCVManager无法打开问题

ps:有些问题是因为运行中版本原因造成的错误,有些问题是因为进行ndk编译时引起的错误。

2、可能在之前OpenCV版本中引入SDK后需要再进行ndk编译才能正常使用,但是目前(OpenCV4.5.4)引入后无需进行ndk编译;

3、由于版本问题造成一大堆问题,本篇文章中使用的AS版本为北极狐版本,OpenCV版本为4.5.4(最开始使用4.6.0版本按其他文章进行ndk编译引出"OpenCV 4.x+ requires enabled C++11 support...错误,于是下载2.x以及3.x均由于各种问题无法正常运行);

4、推荐查看自己AS版本发布日期,再去OpenCV官网下载AS版本发布后一段时间的版本,也需不同AS版本可以兼容多个OpenCV版本,但是选择与其发布时间相近的可以避免很多不必要的问题。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值