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

网友投稿 409 2022-12-09


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增加相机权限

三、使用

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:FYzYtbDzDB 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)

}

}

}

}

}

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/jcv_surface_view"

android:layout_width="match_parent"

android:layout_height="match_parent" />

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/jcv_surface_view"

android:layout_width="match_parent"

android:layout_height="match_parent" />

android:id="@+id/jcv_surface_view"

android:layout_width="match_parent"

android:layout_height="match_parent" />

结果展示:

展示图

Demo 的 github 地址 https://github.com/Mp5A5/AndroidOpenCv


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java上传下载文件并实现加密解密
下一篇:Spring boot集成redis lettuce代码实例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~