第32讲 Android Camera2 API AE自动曝光 第2部分

2024-03-24 20:30

本文主要是介绍第32讲 Android Camera2 API AE自动曝光 第2部分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本讲是Android Camera专题系列的第32讲,我们介绍Android Camera2 API专题的AE自动曝光第2部分,AE自动曝光包括如下内容,第二部分介绍后5章节:

  1. AE是什么
  2. 3A总开关
  3. AE模式
  4. AE状态
  5. 拍照前AE测光
  6. 曝光补偿(EV)
  7. AE Lock
  8. AE状态转换
  9. AE测光区域
  10. 帧率控制

视频在线观看:

  • 视频观看:
    •  极客笔记:极客笔记在线课程

加入知识星球与更多Camera同学交流
– 星球名称:深入浅出Android Camera
– 星球ID: 17296815

曝光补偿(EV)

CaptureRequest#CONTROL_AE_EXPOSURE_COMPENSATION调节AE算法的目标亮度

  1. 是否支持:读取CameraCharacteristics#CONTROL_AE_COMPENSATION_RANGE,为空或者[0,0]表示不支持调整曝光补偿
  2. EV的计算:0EV表示不做曝光补偿,1EV表示提升1倍图像亮度, -1EV表示消减一半图像亮度,在Android中需要读取CameraCharacteristics#CONTROL_AE_COMPENSATION_STEP来计算EV:

  • EV Range为[Min.exposure compensation * aeCompensationStep, Max.exposure compensation * aeCompensationStep],要求

    • FULL和LIMITED设备EV Range必须包含[-2, 2]
    • LEGACY设备没要求

  1. 只有在android.control.aeMode != OFF时才生效

  2. 修改曝光补偿后,如果AE没有Lock住,AE算法需要重新收敛,可能需要多帧才能完成曝光补偿动作

AE Lock

CaptureRequest#CONTROL_AE_LOCK标识是否将AE参数锁定在参数上

  1. 是否支持:需要读取CameraCharacteristics#CONTROL_AE_LOCK_AVAILABLE,支持MANUAL_SENSOR和BURST_CAPTURE的设备必须要支持AE Lock
  2. 该动作不能锁住Flash,当AE模式为ON_AUTO_FLASH / ON_ALWAYS_FLASH / ON_AUTO_FLASH_REDEYE,AE Lock后Flash仍然可能打闪

    • ON_AUTO_FLASH / ON_AUTO_FLASH_REDEYE:在暗环境下会打闪
    • ON_ALWAYS_FLASH:总是会打闪,因为AE参数锁定了,所以可能会过曝
  3. 该动作不能锁住曝光补偿(CaptureRequest#CONTROL_AE_EXPOSURE_COMPENSATION),设置曝光补偿仍然生效
  4. AE Lock后,做AE preCapture trigger START/CANCEL是没有效果的

  5. 在自动AE和手动AE间切换时,如果避免Flicker现象,建议操作步骤如下

    1. 设置AE模式为ON
    2. Lock AE
    3. 从CaptureResult中等待AE Lock成功
    4. 将曝光参数(曝光时间,Sensitivity)从CaptureResult中获取出来,设置给手动AE的CaptureRequest
    5. 提交手动AE的CaptureRequest
    6. 然后随意更改手动曝光参数

AE状态转换

AE状态转换-OFF

AE状态转换-OFF

AE状态转换-ON

AE状态转换-ON

AE状态转换-ON 两个相邻CaptureResults多个状态切换

AE状态转换-ON 两个相邻CaptureResults多个状态切换

AE测光区域

CaptureRequest#CONTROL_AE_REGIONS设置AE的测光区域

  1. 判断是否支持:读取CameraCharacteristics#CONTROL_MAX_REGIONS_AE
    • Hardware Level为FULL的设备必须支持(> 0)
  2. 设置的值为MeteringRectangle(int x, int y, int width, int height, int meteringWeight)
    • 当支持设置多个测光区域是,每个测光区域的权重范围是[0, 1000],权重越大的区域对测光结果影响越大,权重为0表示忽略对应的测光区域
  3. 坐标系
    • 不支持畸变矫正的设备(DISTORTION_CORRECTION_MODE)
      • Left, top = [0, 0], right bottom = [activeArraySize.width – 1, activeArraySize.height – 1]
    • 支持畸变矫正的设备(DISTORTION_CORRECTION_MODE)
      • OFF
      • Left, top = [0, 0], right bottom = [preCorrectionActiveArraySize.width – 1, preCorrectionActiveArraySize.height – 1]
      • Not-OFF
      • Left, top = [0, 0], right bottom = [activeArraySize.width – 1, activeArraySize.height – 1]
    • 当android.sensor.pixelMode 设置为CameraMetadata.SENSOR_PIXEL_MODE_MAXIMUM_RESOLUTION时,需要参考activeArraySizeMaximumResolution / preCorrectionActiveArraySizeMaximumResolution
  4. 受Crop Region的限制
    • RAW转换为YUV后,设置的Crop Region才会生效,也就是Crop Region不是在Raw域生效的
    • 只有在Crop Region区域内的测光区域才能生效,Crop Region是由Zoom决定的
    • >= API Level 30
      • 如果通过zoomRatio来进行Zoom,相同的aeRegions在不同的ZoomRatio下面代表不同的区域(可以理解为使用ZoomRatio时,HAL会自动计算crop region和ae regions填到CaptureResult里面)
      • 如果通过crop region来进行Zoom,相同的aeRegions在不同的crop regions下面还是代表相同的区域
      • 举例
      • aeRegion的计算的坐标系为[0,0,2000,1500],放大2倍的情况下,想将左上角1/4的区域设置为测光区域
        • 如果通过zoomRatio设置为2来实现,需要将aeRegion设置为[0,0,1000,750]
        • 如果通过zoomRatio设置为1,crop region设置为[500, 375, 1500, 1125]来实现,需要将aeRegion设置为[500, 375,1000,750]

帧率控制

CaptureRequest#CONTROL_AE_TARGET_FPS_RANGE设置帧率,AE算法计算曝光时间时会受到该值的影响,最大曝光时间不能超过最小帧率对应的曝光时间

  1. 只对AE自动模式有用,AE手动模式不受该值的影响
  2. 可以设置哪些Range
    • 从CameraCharacteristics#CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES获取支持的列表
    • 录像时选定恒定帧率,也即range的最小值等于最大值
    • 该列表不包含高帧率的Range,录制高帧率时也是通过设置CaptureRequest#CONTROL_AE_TARGET_FPS_RANGE来控制帧率

这篇关于第32讲 Android Camera2 API AE自动曝光 第2部分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/842688

相关文章

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.