目标
已有一个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'
}
完成
文章描述了一次将PyTorch项目在Android平台上集成OpenCV进行图像处理的过程中遇到的问题,包括处理后的bitmap显示、findContours方法的应用以及多个SO库冲突的解决方法。通过调整build.gradle文件,设置packagingOptions来优先选择特定的SO库,最终解决了冲突问题。
978

被折叠的 条评论
为什么被折叠?



