当前位置: 移动技术网 > IT编程>移动开发>Android > Android通过Java sdk的方式接入OpenCv的方法

Android通过Java sdk的方式接入OpenCv的方法

2020年06月23日  | 移动技术网IT编程  | 我要评论

捡来的老婆是律师,卜卦铃声,濮阳招标

简述

公司最近要做运动检测和眼球追踪,鉴于资费等因素,最后考虑使用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="http://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内容请搜索移动技术网以前的文章或继续浏览下面的相关文章希望大家以后多多支持移动技术网!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网