由于要做一个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版本,但是选择与其发布时间相近的可以避免很多不必要的问题。
|