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

所属分类: 软件编程 / Android 阅读数: 62
收藏 0 赞 0 分享

简述

公司最近要做运动检测和眼球追踪,鉴于资费等因素,最后考虑使用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 动画之AlphaAnimation应用详解

本节讲解AlphaAnimation 动画,窗口的动画效果,淡入淡出什么的,有些游戏的欢迎动画,logo的淡入淡出效果就使用AlphaAnimation,具体的祥看本文,需要的朋友可以参考下
收藏 0 赞 0 分享

Android 动画之TranslateAnimation应用详解

本节讲解TranslateAnimation动画,TranslateAnimation比较常用,比如QQ,网易新闻菜单条的动画,就可以用TranslateAnimation实现,本文将详细介绍通过TranslateAnimation 来定义动画,需要的朋友可以参考下
收藏 0 赞 0 分享

Android 动画之ScaleAnimation应用详解

本节讲解ScaleAnimation 动画在应用中的实现,有需要的朋友可以参考下
收藏 0 赞 0 分享

Android 动画之RotateAnimation应用详解

本节讲解旋转动画效果RotateAnimation方法的应用,有需要的朋友可以参考下
收藏 0 赞 0 分享

Android开发之文件操作模式深入理解

本文将介绍Android开发之文件操作模式,需要了解的朋友可以参考下
收藏 0 赞 0 分享

Android应用程序窗口(Activity)窗口对象(Window)创建指南

本文将详细介绍Android应用程序窗口(Activity)的窗口对象(Window)的创建过程,需要了解的朋友可以参考下
收藏 0 赞 0 分享

android activity设置无标题实现全屏

本文将详细介绍Android如何设置Activity全屏和无标题的实现方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android启动模拟器报错解决方法

本文将详细介绍Android模拟器报"Failed To Allocate memory 8"错误的解决办法,需要了解的朋友可以参考下
收藏 0 赞 0 分享

Android如何实现非本地图片的点击态

Android如何实现非本地图片的点击态,本文提供了详细的实现代码,需要了解的朋友可以参考下
收藏 0 赞 0 分享

android viewpaper实例探讨

本文将提供一个android viewpaper实例实现过程,需要了解更多的朋友可以参考下
收藏 0 赞 0 分享
查看更多