小編這次要給大家分享的是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>結果展示:

展示圖
看完這篇關于Android如何通過Java sdk的方式接入OpenCv的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。