简述
公司最近要做运动检测和眼球追踪,鉴于资费等因素,最后考虑使用opencv的相关api来来满足业务需求。在使用过程中发现opencv的v4.2.0和v4.1.2接入后均存在一些bug,所以最后选择了v4.1.0版本。
接入步骤
一、下载opencv sdk
前往opencv官网下载对应的android v4.1.0版本的sdk。
二、android studio 集成opencv sdk
1、android studio 下载cmake和ndk
2、android studio 新建ndk项目
3、android studio 导入opencv sdk
将下载后的opencv sdk进行解压。
将解压后的opencv sdk目录下的sdk目录里面的java包通过moudule的方式导入到studio中。
3、修改导入opencv的build.gradle
修改opencv的build.gradle的对应的compilesdkversion等信息。只需复制app下的build.gradle文件中的即可。记住两点:
apply plugin: ‘com.android.library’一定要改成library;
去掉applicationid “com.xx.xx”
4、导入so库
在项目app/src/main目录下新建jnilibs,并将解压后的opencv sdk 目录下对应的路径 sdk/native/libs 中的 文件复制到jnilibs。
androidmanifest增加相机权限
<uses-permission android:name="android.permission.camera" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" />
三、使用
1、application中检测是否接入成功。
override fun oncreate() { super.oncreate() opencvloader.initdebug() val loadsuccess: boolean = opencvloader.initdebug() if (!loadsuccess) { log.e("-->", "opencv load fail") } else { log.e("-->", "opencv load success") } }
2、动态申请相机权限
if(contextcompat.checkselfpermission(this, manifest.permission.camera) != packagemanager.permission_granted){ activitycompat.requestpermissions(this, arrayof(manifest.permission.camera), 1); }else{ startactivity(intent(this,opencvactivity::class.java)) }
3、测试opencv
class opencvactivity : appcompatactivity(), cvcameraviewlistener2 { private lateinit var mrotateframe: mat private lateinit var mrgbframe: mat public override fun oncreate(savedinstancestate: bundle?) { super.oncreate(savedinstancestate) window.addflags(windowmanager.layoutparams.flag_keep_screen_on) setcontentview(r.layout.activity_opencv) jcv_surface_view.setcvcameraviewlistener(this) // 开启前置摄像头 jcv_surface_view.setcameraindex(camerabridgeviewbase.camera_id_front) } public override fun onpause() { super.onpause() if (jcv_surface_view != null) { jcv_surface_view!!.disableview() } } public override fun onresume() { super.onresume() if (!opencvloader.initdebug()) { opencvloader.initasync(opencvloader.opencv_version, this, mloadercallback) } else { mloadercallback.onmanagerconnected(loadercallbackinterface.success) } } public override fun ondestroy() { super.ondestroy() if (jcv_surface_view != null) { jcv_surface_view!!.disableview() } } override fun oncameraviewstarted(width: int, height: int) { mrotateframe = mat() mrgbframe = mat() } override fun oncameraviewstopped() {} override fun oncameraframe(inputframe: cvcameraviewframe): mat { mrgbframe = inputframe.rgba() // 旋转屏幕 core.flip(mrgbframe, mrotateframe, 1) return mrotateframe } private val mloadercallback: baseloadercallback = object : baseloadercallback(this) { override fun onmanagerconnected(status: int) { when (status) { loadercallbackinterface.success -> { jcv_surface_view!!.enableview() } else -> { super.onmanagerconnected(status) } } } } }
<relativelayout xmlns:android="https://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <org.opencv.android.javacameraview android:id="@+id/jcv_surface_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </relativelayout>
结果展示:
展示图
demo 的 github 地址 https://github.com/mp5a5/androidopencv
到此这篇关于android通过java sdk的方式接入opencv的方法的文章就介绍到这了,更多相关android java sdk接入opencv内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/addevelopment/898298.html