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