OpenCV for Android打开相机
来源:互联网 发布:轨道交通大数据平台 编辑:程序博客网 时间:2024/05/01 09:00
一、知识准备:
1.了解Android工程如何运行在设备上
2.了解C/C++编译过程,能够读懂makefile
二、实现流程:
1.打开Eclipse,新建一个空白的Android工程:
项目名称为OpenCV_Test:
2.为新建工程引入OpenCV Library - 3.1.0库工程:
选择工程,右键点击Properties(属性),然后在Android页签中,用Add功能添加一个库工程引用。
3.打开src目录下面的MainActivity,由于我们的目标是在应用中通过OpenCV的Java API实现打开相机全屏显示,并获取预览框,所以MainActivity需要实现CvCameraViewListener2接口,可以实现三个方法,分别是:onCameraViewStarted、onCameraViewStopped和onCameraFrame,关键的图像处理写在onCameraFrame函数中:
4.修改AndroidManifest.xml文件:
添加相机的相关权限:
设置应用的界面主题为没有顶部标题栏且全屏显示的,在application标签中添加:
5.为界面布局文件添加显示相机内容的组件:
打开res/layout下面的activity_main.xml布局文件,往布局中添加一个OpenCV的视觉组件JavaCameraView:
声明一个CameraBridgeViewBase对象,用于存放activity_main.xml中的JavaCameraView组件,并在OnCreate中实现绑定和添加事件监听:
7.添加C/C++编译支持,即Add Native Support,这是为了不依赖于OpenCV Manager,直接引入库文件进行编译:
记住这里的填写的名称就是引入的库文件被编译生成.so文件的名称:
打开生成的jni目录下的Android.mk文件,这个是C/C++编译和链接时使用到的makefile配置文件,稍微做一点点修改内容,在“include $(CLEAR_VARS)”后面添加以下内容:
如此,我们就完成了库文件的引入操作,那么接下来就是让相机的输入帧展示在预览组件JavaCameraView上。
8.修改public Mat onCameraFrame(CvCameraViewFrame inputFrame)回调函数的内容了,这个函数在相机刷新每一帧都会调用一次,而且每次的输入参数就是当前相机视图信息,我们直接获取其中的RGBA信息作为Mat数据返回给显示组件即可:
9.以上操作中,我们在OnCreate函数中已经获取到mCVCamera对象,只有调用mCVCamera.enableView()之后,预览组件才会显示每一帧的Mat图像,但是在显示之前我们必须先确保OpenCV的库文件已经加载完成,所以调用此方法需要进行异步处理:
所以只有当mLoaderCallback收到LoaderCallbackInterface.SUCCESS消息的时候,才会打开预览显示,那么这个消息是从哪里发出来的呢,这就需要我们重写Activity的onRusume方法了,因为每次当前Activity激活都会调用此方法,所以可以在此处检测OpenCV的库文件是否加载完毕:
三、结果展示:
至此,我们就完成了设备相机打开以及输入预览数据的获取,运行在设备上可以看到:
- OpenCV for Android打开相机
- OpenCV学习笔记(六)—— OpenCV for Android打开相机
- Android打开相机
- android打开相机拍照
- Android 打开相机,相册
- opencv打开大恒水晶相机教程
- android 打开相机和相册
- Opencv For IOS相机环境搭建
- Qt for Android调用原生接口打开相机拍照并存储照片
- Jetson TX1板载相机opencv调用打开
- Jetson TX2板载相机opencv调用打开
- Opencv 打开网络相机时的一些参数设置
- Jetson TX2板载相机opencv调用打开
- 用opencv打开NVIDIA Jetson TX2 的相机
- Android 调用相机、打开相册、裁剪图片
- Android之如何打开系统相机
- Android-打开相机拍照并跳转
- Android打开系统相机 适配Android7.0
- 种植树苗
- Java集合系列(2)--ArrayList
- Java.eclipse启动报错java.lang.IllegalStateException: LifecycleProcessor
- Gstreamer插件教程2.6—编写一个插件(Writing a Plugin):状态是什么?(What are states?)
- linux常用命令总结
- OpenCV for Android打开相机
- Java 单例模式 五种常见的写法
- 城市列表简称JSON数据
- jdk9的新特性
- 获取checkbox的值传给后台
- 中医行业与软件行业的职业发展比较
- 方法的重载与重写
- 题目1480:最大上升子序列和
- C++接口继承与实现继承的区别和选择