ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android:Camera2开发详解

2021-08-03 10:33:53  阅读:417  来源: 互联网

标签:请求 Camera2 详解 参数 图像 CameraCharacteristics Android CaptureRequest 摄像头


  • Camera2架构概述

    • Camera2架构图

在这里插入图片描述

  • Camera2引用了管道的概念将安卓设备和摄像头之间联通起来,系统向摄像头发送 Capture 请求,而摄像头会返回
    CameraMetadata。这一切建立在一个叫作 CameraCaptureSession 的会话中。

  • Camera2拍照流程图

在这里插入图片描述

  • Camera2中比较重要的类及方法

    • CameraManager 摄像头管理器,用于打开和关闭系统摄像头

    • getCameraIdList() 返回当前设备中可用的相机列表

    • getCameraCharacteristics(String cameraId) 根据摄像头id返回该摄像头的相关信息

    • openCamera(String cameraId, final CameraDevice.StateCallback callback,Handler handler)
      打开指定cameraId的相机。参数callback为相机打开时的回调,参数handler为callback被调用时所在的线程

  • CameraDevice 描述系统摄像头,类似于早期的Camera

    • createCaptureRequest(int templateType):

    • 创建一个新的Capture请求。参数templateType代表了请求类型,请求类型一共分为六种,分别为

         TEMPLATE_PREVIEW : 创建预览的请求
         TEMPLATE_STILL_CAPTURE: 创建一个适合于静态图像捕获的请求,图像质量优先于帧速率
         TEMPLATE_RECORD : 创建视频录制的请求
         TEMPLATE_VIDEO_SNAPSHOT : 创建视视频录制时截屏的请求
         TEMPLATE_ZERO_SHUTTER_LAG : 创建一个适用于零快门延迟的请求。在不影响预览帧率的情况下最大化图像质量
         TEMPLATE_MANUAL : 创建一个基本捕获请求,这种请求中所有的自动控制都是禁用的(自动曝光,自动白平衡、自动焦点)
      
    • createCaptureSession(List outputs,CameraCaptureSession.StateCallback callback,Handler handler)

    • 创建CaptureSession会话。第一个参数 outputs 是一个 List 数组,相机会把捕捉到的图片数据传递给该参数中的
      Surface 。第二个参数 StateCallback 是创建会话的状态回调。第三个参数描述了 StateCallback 被调用时所在的线程

  • CameraCharacteristics

    • 描述摄像头的各种特性,类似于Camera1中的CamerInfo。通过CameraManager的getCameraCharacteristics(String
      cameraId)方法来获取

    • get(Key key) 通过制定的key获取相应的相机参数。常用key值有:

        CameraCharacteristics.LENS_FACING
        获取摄像头方向。前置摄像头(LENS_FACING_FRONT)或 后置摄像头(LENS_FACING_BACK)
      
         CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL      获取当前设备支持的相机特性
         
         CameraCharacteristics.SENSOR_ORIENTATION:获取摄像头方向
         CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP
         获取StreamConfigurationMap,它是管理摄像头支持的所有输出格式和尺寸
      
         CameraCharacteristics.FLASH_INFO_AVAILABLE  是否支持闪光灯
         CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT  同时检测到人脸的数量  
         CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES:   相机支持的人脸检测模式
      
  • CaptureRequest

    • 描述了一次操作请求,拍照、预览等操作都需要先传入CaptureRequest参数,具体的参数控制也是通过CameraRequest的成员变量来设置

    • addTarget(Surface outputTarget) 给此次请求添加一个Surface对象作为图像的输出目标

    • set(Key key, T value) 设置指定的参数值。

         // 自动对焦   captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)
         // 闪光灯   captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH)
         // 根据摄像头方向对保存的照片进行旋转,使其为"自然方向"    captureRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION, mCameraSensorOrientation)
         // 人脸检测模式  captureRequestBuilder.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE,CameraCharacteristics.STATISTICS_FACE_DETECT_MODE_SIMPLE)
      
  • CameraCaptureSession

    • 当需要拍照、预览等功能时,需要先创建该类的实例,然后通过该实例里的方法进行控制(例如:拍照 capture())

    • setRepeatingRequest(CaptureRequest request,CaptureCallback listener, Handler handler):

    • 根据传入的 CaptureRequest 对象开始一个无限循环的捕捉图像的请求。第二个参数 listener 为捕捉图像的回调,在回调中可以拿到捕捉到的图像信息

    • capture( CaptureRequest request,CaptureCallback listener, Handler handler) 拍照。第二个参数为拍照的结果回调

  • CaptureResult 描述拍照完成后的结果

  • ImageReader

    • 用于接收拍照结果和访问拍摄照片的图像数据。

    • 得到一个ImageReader对象的方法为newInstance(int width, int height, int format, int maxImages)。前两个参数是保存图片的宽高,第三个参数为保存图片的格式,第四个参数代表用户可以同时访问到的最大图片数量

    • acquireNextImage() 得到ImageReader图像队列中的下一张图片,返回值是一个Image对象

  • Image 一个完整的图片缓存

    • getPlanes() 获取该图像的像素平面数组。这个数组的大小跟图片的格式有关,如 JPEG格式数组大小为1
  • Plane 图像数据的单色平面

    • getBuffer() 获取包含帧数据的ByteBuffer。通过这个ByteBuffer我们就可以把图片保存下来

注说明:例子在https://github.com/smashinggit/Study链接上,使用kotlin语言,可用studio导入查看demo实现

标签:请求,Camera2,详解,参数,图像,CameraCharacteristics,Android,CaptureRequest,摄像头
来源: https://blog.csdn.net/weixin_38360181/article/details/119343974

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有