Android 通過Java sdk的方式接入OpenCv

Android 通過Java sdk的方式接入opencv
Android 通過cmake的方式接入opencv

簡述

公司最近要做運動檢測和眼球追蹤,鑒于資費等因素,最后考慮使用OpenCv的相關Api來來滿足業務需求。在使用過程中發現OpenCv的v4.2.0和v4.1.2接入后均存在一些bug,所以最后選擇了v4.1.0版本。

接入步驟

一、下載OpenCV Sdk

前往OpenCv官網下載對應的Android v4.1.0版本的sdk。

圖1

二、Android Studio 集成OpenCV Sdk

1、Android Studio 下載cmake和ndk

圖2

2、Android Studio 新建ndk項目

圖3
圖4
圖5

3、Android Studio 導入OpenCv Sdk

  1. 將下載后的OpenCv Sdk進行解壓。
  2. 將解壓后的OpenCv Sdk目錄下的sdk目錄里面的java包通過Moudule的方式導入到Studio中。
圖6
圖7
圖8
  1. 修改導入opencv的build.gradle
圖9

修改opencv的build.gradle的對應的compileSdkVersion等信息。只需復制app下的build.gradle文件中的即可。記住兩點:

  • apply plugin: 'com.android.library'一定要改成library;
  • 去掉applicationId "com.xx.xx"
  1. 導入so庫

在項目app/src/main目錄下新建jniLibs,并將解壓后的OpenCv Sdk 目錄下對應的路徑 sdk/native/libs 中的 文件復制到jniLibs。

圖10
  1. AndroidManifest增加相機權限
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
圖11

三、使用

  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")
       }
}
  1. 動態申請相機權限
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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容