Android如何通过Javasdk的方式接入OpenCv

小编这次要给大家分享的是Android如何通过Java sdk的方式接入OpenCv,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。

尚义ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:028-86922220(备注:SSL证书合作)期待与您的合作!

简述

公司最近要做运动检测和眼球追踪,鉴于资费等因素,最后考虑使用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增加相机权限



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)
        }
      }
    }
  }
}


  

结果展示:

Android如何通过Java sdk的方式接入OpenCv

展示图

看完这篇关于Android如何通过Java sdk的方式接入OpenCv的文章,如果觉得文章内容写得不错的话,可以把它分享出去给更多人看到。


网站标题:Android如何通过Javasdk的方式接入OpenCv
文章起源:http://ybzwz.com/article/pesjdg.html