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内容请搜索ZaLou.Cn以前的文章或继续浏览下面的相关文章希望大家以后多多支持ZaLou.Cn!
- Struts2【开发Action】
- 算法07 五大查找之:索引查找
- Struts2【拦截器】
- 算法08 五大查找之:二叉排序树(BSTree)
- Struts2【UI标签、数据回显、资源国际化】
- mybatis-plus思维导图,让mybatis-plus不再难懂
- 10(01)总结形式参数,包,修饰符,内部类
- Java的参数传递是值传递还是引用传递
- 通过shell脚本来得到不稳定的执行计划(r4笔记第40天)
- Struts2【OGNL、ValueStack】
- 如何用Python爬虫实现图片自动下载?
- Hibernate【查询详解、连接池、逆向工程】
- Hibernate【缓存】知识要点
- MySQL 存储过程的简单使用
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- three.js 制作逻辑转体游戏(下)
- ROS机器人TF基础(坐标相关概念和实践)
- (在模仿中精进数据可视化01) 全国38城居住自由指数可视化
- js字符串/数组常用方法总结
- ThinkPHP5+mpdf 实现富文本生成 PDF文件
- nodejs使用readline逐行读取和写入文件
- go语言逐行读取和写入文件
- SpringBoot中Tomcat是如何启动的
- 自定义注解详解及应用
- 微服务开源框架TARS 之 框架服务解析
- dotnet 在 UOS 国产系统上使用 Xamarin Forms 创建 xaml 界面的 GTK 应用
- K8s集群上使用Helm部署2.4.6版本Rancher集群
- VMware下安装CentOS
- leetcode多线程之按序打印
- 表格的实现