目标
已有一个pytorch项目在android下的移植,使用了pytorch_android_lite:1.9.0和androidx.camera:camera-core:${1.1.0-beta01},实现了一个拍照->深度学习处理->显示的过程。
在该项目基础上引入opencv检测,将深度学习处理后的一张二值图使用findContours方法获取区域。
移植过程
参考OpenCV On Android最佳环境配置指南(Android Studio篇)进行一个新项目demo的配置。遇到的问题和解决方法:
- 导入的模块是sdk,不是sdk/java
- 导入项目的build.gradle中sdk版本要调整成和主项目一致
System.loadLibrary("opencv_java4");
这一步取决于下载的opencv版本,我是opencv4- 处理完成后的bitmap无法显示:不能直接将mat覆盖到原有的bitmap,需要重新create一个出来
- findContours直接退出:findContours的输入通道是1,对应的opencv中的
CvType.CV_8UC1
和bitmap中的ALPHA_8
,普通的图像一般是四通道,即opencv中的CvType.CV_8UC4
和bitmap中的ARGB_8888
。 - 处理输出点
List<MatOfPoint>
,每一个MatOfPoint
都可以用toArray
转成Point[]
型数组,point.x
和point.y
可以获得这个点的x和y
在完成demo移植后,将移植方法在pytorch项目上重新实践,出现错误:
More than one file was found with OS independent path 'lib/armeabi-v7a/libc++_shared.so'
使用 packagingOptions {exclude 'lib/armeabi-v7a/libc++_shared.so'}
后继续报错下一个so库,检查发现有4个so库与之相关,全部exclude后程序能启动,但闪退。
在主模块和opencv模块分别尝试exclude,都不能成功,猜测是pytorch也引入了这个so库造成冲突
解决方法参考:关于Android类/库/so冲突那些事,看这个就够了
优先选择指定的so库,在整个项目的build.gradle
下的android下添加:
packagingOptions {
pickFirst 'lib/arm64-v8a/libc++_shared.so'
pickFirst 'lib/armeabi-v7a/libc++_shared.so'
pickFirst 'lib/x86/libc++_shared.so'
pickFirst 'lib/x86_64/libc++_shared.so'
}
完成