OpenCV在安卓项目中引入的解决过程记录

目标

已有一个pytorch项目在android下的移植,使用了pytorch_android_lite:1.9.0和androidx.camera:camera-core:${1.1.0-beta01},实现了一个拍照->深度学习处理->显示的过程。
在该项目基础上引入opencv检测,将深度学习处理后的一张二值图使用findContours方法获取区域。

移植过程

参考OpenCV On Android最佳环境配置指南(Android Studio篇)进行一个新项目demo的配置。遇到的问题和解决方法:

  1. 导入的模块是sdk,不是sdk/java
  2. 导入项目的build.gradle中sdk版本要调整成和主项目一致
  3. System.loadLibrary("opencv_java4");这一步取决于下载的opencv版本,我是opencv4
  4. 处理完成后的bitmap无法显示:不能直接将mat覆盖到原有的bitmap,需要重新create一个出来
  5. findContours直接退出:findContours的输入通道是1,对应的opencv中的CvType.CV_8UC1和bitmap中的ALPHA_8,普通的图像一般是四通道,即opencv中的CvType.CV_8UC4和bitmap中的ARGB_8888
  6. 处理输出点List<MatOfPoint>,每一个MatOfPoint都可以用toArray转成Point[]型数组,point.xpoint.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'
	 }

完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值