Android通過Java sdk的方式接入OpenCv的方法
簡(jiǎn)述
公司最近要做運(yùn)動(dòng)檢測(cè)和眼球追蹤,鑒于資費(fèi)等因素,最后考慮使用OpenCv的相關(guān)Api來(lái)來(lái)滿足業(yè)務(wù)需求。在使用過程中發(fā)現(xiàn)OpenCv的v4.2.0和v4.1.2接入后均存在一些bug,所以最后選擇了v4.1.0版本。
接入步驟
一、下載OpenCV Sdk
前往OpenCv官網(wǎng)下載對(duì)應(yīng)的Android v4.1.0版本的sdk。

二、Android Studio 集成OpenCV Sdk
1、Android Studio 下載cmake和ndk

2、Android Studio 新建ndk項(xiàng)目



3、Android Studio 導(dǎo)入OpenCv Sdk
將下載后的OpenCv Sdk進(jìn)行解壓。
將解壓后的OpenCv Sdk目錄下的sdk目錄里面的java包通過Moudule的方式導(dǎo)入到Studio中。



3、修改導(dǎo)入opencv的build.gradle

修改opencv的build.gradle的對(duì)應(yīng)的compileSdkVersion等信息。只需復(fù)制app下的build.gradle文件中的即可。記住兩點(diǎn):
apply plugin: 'com.android.library'一定要改成library;
去掉applicationId "com.xx.xx"
4、導(dǎo)入so庫(kù)
在項(xiàng)目app/src/main目錄下新建jniLibs,并將解壓后的OpenCv Sdk 目錄下對(duì)應(yīng)的路徑 sdk/native/libs 中的 文件復(fù)制到j(luò)niLibs。

AndroidManifest增加相機(jī)權(quán)限
<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" />

三、使用
1、application中檢測(cè)是否接入成功。
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、動(dòng)態(tài)申請(qǐng)相機(jī)權(quán)限
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、測(cè)試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()
// 旋轉(zhuǎn)屏幕
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>
結(jié)果展示:

展示圖
Demo 的 Github 地址 https://github.com/Mp5A5/AndroidOpenCv
到此這篇關(guān)于Android通過Java sdk的方式接入OpenCv的方法的文章就介紹到這了,更多相關(guān)Android Java sdk接入OpenCv內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 解決java.lang.NoClassDefFoundError: android.support.v4.animation.AnimatorCompatHelper問題
- Java可以寫android的應(yīng)用程序嗎
- 解決AndroidStudio無(wú)法運(yùn)行java中的mian方法問題
- Java/Android 實(shí)現(xiàn)簡(jiǎn)單的HTTP服務(wù)器
- java、android可用的rtp封包解包h264案例
- AndroidStudio插件GsonFormat之Json快速轉(zhuǎn)換JavaBean教程
- 使用Android studio3.6的java api方式調(diào)用opencv
- 淺談Android Studio導(dǎo)出javadoc文檔操作及問題的解決
- 解決android studio 打開java文件 內(nèi)容全變了的問題
- Android Studio Kotlin代碼和java代碼相互轉(zhuǎn)化實(shí)例
- Delphi在Android下使用Java庫(kù)的方法
- Android實(shí)現(xiàn)上傳圖片至java服務(wù)器
- Android 是如何捕捉 java 異常的
相關(guān)文章
Kotlin?coroutineContext源碼層深入分析
表示一個(gè)元素或者是元素集合的接口。它有一個(gè)Key(索引)的Element實(shí)例集合,每一個(gè)Element的實(shí)例也是一個(gè)CoroutineContext,即集合中每個(gè)元素也是集合2022-11-11
Android中獲得手機(jī)屏幕大小實(shí)現(xiàn)代碼
這篇文章主要介紹了Android中獲得手機(jī)屏幕大小實(shí)現(xiàn)代碼,Android開發(fā)中經(jīng)常需要獲得屏幕的寬高,本文直接封裝成一個(gè)工具類,需要的朋友可以參考下2015-06-06
Android編程實(shí)現(xiàn)EditText字?jǐn)?shù)監(jiān)聽并顯示的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)EditText字?jǐn)?shù)監(jiān)聽并顯示的方法,涉及Android EditText文本框事件監(jiān)聽與響應(yīng)相關(guān)操作技巧,需要的朋友可以參考下2017-02-02
Android 線程之自定義帶消息循環(huán)Looper的實(shí)例
這篇文章主要介紹了Android 線程之自定義帶消息循環(huán)Looper的實(shí)例的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-10-10
Android時(shí)間日期拾取器學(xué)習(xí)使用(DatePicker、TimePicker)
這篇文章主要為大家詳細(xì)介紹了Android提供的DatePicker日期拾取器和TimePicker時(shí)間拾取器的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
Android Flutter實(shí)現(xiàn)興趣標(biāo)簽選擇功能
我們?cè)谑状问褂脙?nèi)容類 App 的時(shí)候,不少都會(huì)讓我們選擇個(gè)人偏好,通過這些標(biāo)簽選擇可以預(yù)先知道用戶的偏好信息。我們本篇就來(lái)看看 Flutter 如何實(shí)現(xiàn)興趣標(biāo)簽的選擇,需要的可以參考一下2022-11-11
安卓(android)怎么實(shí)現(xiàn)下拉刷新
這里我們將采取的方案是使用組合View的方式,先自定義一個(gè)布局繼承自LinearLayout,然后在這個(gè)布局中加入下拉頭和ListView這兩個(gè)子元素,并讓這兩個(gè)子元素縱向排列。對(duì)安卓(android)怎么實(shí)現(xiàn)下拉刷新的相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-04-04
Android Studio3.5開發(fā)工具(安卓開發(fā)工具)安裝步驟詳解
這篇文章主要為大家詳細(xì)介紹了Android Studio3.5開發(fā)工具安裝、安卓開發(fā)工具的安裝步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09
Android獲取設(shè)備隱私 忽略6.0權(quán)限管理
這篇文章主要介紹了Android獲取設(shè)備隱私,忽略6.0權(quán)限管理,感興趣的小伙伴們可以參考一下2016-01-01
Android中父View和子view的點(diǎn)擊事件處理問題探討
當(dāng)屏幕中包含一個(gè)ViewGroup,而這個(gè)ViewGroup又包含一個(gè)子view,這個(gè)時(shí)候android系統(tǒng)如何處理Touch事件呢,接下來(lái)將對(duì)此問題進(jìn)行深入了解,感興趣的朋友可以了解參考下,或許對(duì)你有所幫助2013-01-01

