Android Camera2采集摄像头原始数据

作者:HBStream 时间:2021-06-23 22:55:53 

最近研究了一下android摄像头开发相关的技术,也看了Google提供的Camera2Basic调用示例,以及网上一部分代码,但都是在TextureView等预览基础上实现,而我想要做的是在不预览的情况下,能获取到摄像头原始数据流,并由自己来决定是否绘制显示。经过一番折腾,初步实现了自己的目的—CamCap程序。

需求分析

其实主要就是在不预览的情况下获取到摄像头原始数据,目的嘛,一是为了灵活性,方便随时开启关闭预览,二是为了以后可以直接对数据进行处理,三是为了其他程序开发做一些准备。于是实现一下几个功能:

获取摄像头数据,并手动绘制图像 随时开启/关闭预览 随时保存当前摄像头图像,即使在关闭预览情况下 Android Camera2接口

查阅了一些资料,Android Java层由于从API21开始,已经废弃原Camera接口,所以这里采用Camera2接口。相比Camera接口来说,第二代摄像头接口,调用复杂多了,但是灵活性也更高了,通过Google的Camera2Basic例子可以很清楚的了解到使用方式。这里把CamCap程序中的Camera2的调用顺序整理如下:

Android Camera2采集摄像头原始数据

和其他程序一样,通过ImageReader来获取到CameraCaptureSession传递出来的数据,与Google例子不同的是,我取消了把TextureView的传递,改为单独以ImageReader来获取图像流,并设置为YUV_420_888格式,以拿到原始数据。

打开摄像头

Android Camera2采集摄像头原始数据

摄像头打开后,创建对话

Android Camera2采集摄像头原始数据

调用libyuv做RGB之间的数据转换

获取到YUV数据之后,就可以在UI界面上进行绘制了,通过简单了解,可以通过OpenGLES来绘制,也可以转为Bitmap直接在TextureView上绘制。这里为了简单,选择了后者。然而后来发现,android.graphics.Bitmap并不支持直接将YUV数据存入,只能转为RGB数据格式,才能存入Bitmap,进而在TextureView上绘制。YUV转换RGB,之前在C++上应用过很多次了,可以把现有代码修改一下放到java里运行,不过考虑到性能问题,决定还是使用libyuv。libyuv是一款以c/c++为基础的,专做YUV与RGB格式转换的开源项目,性能非常高。

使用libyuv,需要通过NDK交叉编译,并通过JNI来调用。libyuv编译起来也很简单,首先下载libyuv源码,代码地址是:https://chromium.googlesource.com/libyuv/libyuv 。然后确保NDK已经安装(这个直接在AndroidStudio中就能安装好),之后把NDK目录添加到环境变量。最后,进入libyuv目录,调用ndk-build即可。libyuv项目里已经写好了Android.mk,所以,直接编译就行了(我是在Windows上)。

Android Camera2采集摄像头原始数据

注意!编译的时候遇到JPEG库没有指定的问题,如果不想依赖libjpeg,可以修改Android.mk,删除JPEG库相关编译项就可以解决。

在AndroidStudio上建立c++文件,封装libyuv接口,然后按照JNI规范暴露接口,同时在Java层封装类来调用native方法。

Android Camera2采集摄像头原始数据

绘制图像

在绘制图像的时候,有个坑,那就是图像的旋转,这个是由于手机上的摄像头传感器的视野坐标,一般都是旋转了90度或270度的,所以,需要把摄像头采集到的画面,进行旋转,才能还原出正确的视野画面。传感器旋转方向通过以下值获得,


CameraManager.getCameraCharacteristics(camid).get(CameraCharacteristics.SENSOR_ORIENTATION)

根据这个值,构建Matrix将Bitmap进行旋转

Android Camera2采集摄像头原始数据

Matrix构建代码如下:

Android Camera2采集摄像头原始数据

与上面代码中类似,通过TextureView.lockCanvas(),获取到Canvas,调用drawBitmap()将图像写入,即可完成绘制。

运行截图

开启预览时的4:3画面和16:9画面

Android Camera2采集摄像头原始数据

Android Camera2采集摄像头原始数据

关闭预览,同时可以继续拍照

Android Camera2采集摄像头原始数据

来源:https://www.cnblogs.com/haibindev/p/8408598.html

标签:Android,Camera2,采集,原始数据
0
投稿

猜你喜欢

  • java poi解析word的方法

    2023-08-28 07:31:28
  • 浅谈Java内存区域与对象创建过程

    2022-08-31 17:56:25
  • AlertDialog点击按钮不消失的实现方法

    2023-12-12 07:11:16
  • SpringBoot统一处理功能实现的全过程

    2022-12-24 09:43:26
  • Java Map.values()方法之如何获取Map集合中的所有键值对象

    2022-11-16 15:40:30
  • 微信支付H5调用支付详解(java版)

    2023-03-10 14:21:44
  • 详解Java的Spring框架下bean的自动装载方式

    2022-10-23 08:13:59
  • Java JNDI案例详解

    2022-06-09 07:56:35
  • 完全解析Android多线程中线程池ThreadPool的原理和使用

    2022-04-07 20:19:40
  • Android自定义View控件实现刷新效果

    2022-05-12 14:43:22
  • Android学习之BottomSheetDialog组件的使用

    2023-12-10 07:58:30
  • Android通过代码控制ListView上下滚动的方法

    2022-06-29 03:07:57
  • Android禁止横屏竖屏切换的有效方法

    2023-05-05 10:56:16
  • 浅析Spring工厂的反射和配置文件

    2023-06-22 20:52:23
  • Android获取手机通讯录、sim卡联系人及调用拨号界面方法

    2021-07-02 00:41:07
  • Android开发获取重力加速度和磁场强度的方法

    2022-05-27 23:07:09
  • Spring定时任务无故停止又不报错的解决

    2021-06-06 08:41:27
  • Spring Boot 配置和使用多线程池的实现

    2022-09-04 19:53:02
  • 谈谈你可能并不了解的java枚举

    2023-11-09 21:08:55
  • git自定义_动力节点Java学院整理

    2021-06-11 22:05:49
  • asp之家 软件编程 m.aspxhome.com