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

来自:网络
时间:2020-10-14
阅读:

简述

公司最近要做运动检测和眼球追踪,鉴于资费等因素,最后考虑使用OpenCv的相关Api来来满足业务需求。在使用过程中发现OpenCv的v4.2.0和v4.1.2接入后均存在一些bug,所以最后选择了v4.1.0版本。

接入步骤

 一、下载OpenCV Sdk

前往OpenCv官网下载对应的Android v4.1.0版本的sdk。

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

二、Android Studio 集成OpenCV Sdk

1、Android Studio 下载cmake和ndk

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

2、Android Studio 新建ndk项目

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

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

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

3、Android Studio 导入OpenCv Sdk

将下载后的OpenCv Sdk进行解压。

将解压后的OpenCv Sdk目录下的sdk目录里面的java包通过Moudule的方式导入到Studio中。

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

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

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

3、修改导入opencv的build.gradle

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

修改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。

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

AndroidManifest增加相机权限

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

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

三、使用

 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>

结果展示:

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

展示图

Demo 的 Github 地址 https://github.com/Mp5A5/AndroidOpenCv

返回顶部
顶部