1. 程式人生 > 程式設計 >Android通過Java sdk的方式接入OpenCv的方法

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

簡述

公司最近要做運動檢測和眼球追蹤,鑑於資費等因素,最後考慮使用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

到此這篇關於Android通過Java sdk的方式接入OpenCv的方法的文章就介紹到這了,更多相關Android Java sdk接入OpenCv內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!