Camera2拍照时部分机型非常暗

2023-11-20

一、问题描述

1.部分手机在弱光环境下不管什么分辨率,预览和拍出来的照片都非常的暗

2.部分手机在弱光环境下,预览分辨率1920x1080,输出图片分辨率1920x1080时,预览和拍出来的照片亮度比较亮,但是在预览分辨率1920x1080,输出图片分辨率4000x2250时,预览和拍出来的照片都非常暗

3.不是调整曝光度(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION)能解决的问题,增加曝光值只是使画面变得更加苍白,没有让场景本身变得亮起来。

二、解决方案

1.通过设置曝光时间范围(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE),增加感光元件的曝光时间,接收到更多的光线,使得弱光场景下拍的更亮。

这是调整FPS范围为[15,15]时拍摄的效果和之前较暗时效果的对比。

                                               

这里参考了链接https://stackoverflow.com/questions/28429071/camera-preview-is-too-dark-in-low-light-android/49643140#49643140   其中的这个回答:

 previewRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, getRange());//This line of code is used for adjusting the fps range and fixing the dark preview
 previewRequestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, false);
 previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);

最终我的预览previewBuilder相关设置如下:

//设置预览请求的方式
previewBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);

...

//自动对焦
previewBuilder.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
//设置自动曝光帧率范围
previewBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,getRange());
 //对焦触发器设置为空闲状态
previewBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,CaptureRequest.CONTROL_AF_TRIGGER_IDLE);
captureSession.setRepeatingRequest(previewBuilder.build(),captureCallback, mainHandler);

 private Range<Integer> getRange() {
        CameraManager mCameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
        CameraCharacteristics chars = null;
        try {
            chars = mCameraManager.getCameraCharacteristics(cameraID);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
        Range<Integer>[] ranges = chars.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);

        Range<Integer> result = null;

        for (Range<Integer> range : ranges) {
            //帧率不能太低,大于10
            if (range.getLower()<10)
                continue;
            if (result==null)
                result = range;
            //FPS下限小于15,弱光时能保证足够曝光时间,提高亮度。range范围跨度越大越好,光源足够时FPS较高,预览更流畅,光源不够时FPS较低,亮度更好。
            else if (range.getLower()<=15 && (range.getUpper()-range.getLower())>(result.getUpper()-result.getLower()))
                result = range;
        }
        return result;
    }

实际代码中我设置的自动曝光FPS范围是[10,30],理由是,FPS下限越小,曝光时间越长,那么接收到的光线越多,拍出来的场景就越亮。FPS的范围需要有一定的跨度是因为,FPS太小的时候,比如10,预览会比较卡,体验没那么好,如果范围设置成[15,15]这种,全程都很卡。跨度大一点,在光线足够的时候,FPS会升上去,就不卡了。因为拍照其实对预览的帧率要求没有录像高,因此牺牲一些帧率大大的提高感光度是可以接受的。关于录像使用这种方式会比较卡顿的问题,后面会讲另一个办法。

这里我的代码中没有用到CONTROL_AE_LOCK,有些人可能设置了预览拍照的时候锁定曝光,或者手动调曝光模式,需要注意了。这个方法是不会起作用,因为他是设置在自动曝光模式下的FPS范围,你可能需要设置曝光模式在非锁定状态下或自动曝光模式下,才能起作用。

最后,如果预览的时候亮度正常了,拍照时还是比较暗,需要在拍照的CaptureRequest.Builder也进行这样的设置。

 

2.设置预览请求方式为CameraDevice.TEMPLATE_RECORD,优先保证稳定的帧率,牺牲画面的质量。

previewBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);

设置这种预览请求方式后,即使不设置曝光的FPS范围,也能在弱光环境下看到比较亮的场景,但是,明显的感觉到,噪点变多了,画面没那么清晰了,可以做个切换,对比一下画质。这时也可以去设置曝光FPS的范围,但是作用不大,甚至让本来流畅的预览变得更卡。

最终我的处理是,拍照的时候,预览方式是CameraDevice.TEMPLATE_PREVIEW,画质更清晰,弱光时帧率稍低一点,光线足够时帧率比较流畅。预览和拍出来的照片亮度都很好。录制视频时,预览方式是CameraDevice.TEMPLATE_RECORD,画质稍差,无需设置曝光FPS范围。帧率能够全程保持流畅,弱光环境下视频效果也比较亮。

比较了一下轻颜相机,它采取的应该是统一使用CameraDevice.TEMPLATE_RECORD的预览方式。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Camera2拍照时部分机型非常暗 的相关文章

  • Camera2 教程 一概览

    从 Android 5 0 开始 xff0c Google 引入了一套全新的相机框架 Camera2 xff08 android hardware camera2 xff09 并且废弃了旧的相机框架 Camera1 xff08 androi
  • 两行代码用camera2 打开闪光灯

    CameraManager c 61 CameraManager getSystemService Context CAMERA SERVICE c setTorchMode c getCameraList 0 true 打开闪光灯 c s
  • App版本更新接口的设计

    工作这几年碰到的版本检测升级的接口也算是五花八门 啥样的都有 但肯定有的功能是有个apk的下载链接 能间接或直接提示你是强制还是非强制更新 间接是指提供你后台最新版本号 让你自己与本地版本号通过比较得出是否升级 直接就是后台接口直接返回个B
  • matlab亮度变换实用函数及说明

    本文有两个函数一个是changeclass和intrans changeclass是为了转换图像的类型 function image changeclass class varargin 将图像varargin转换为class类型 swit
  • 一种解决滑动事件和点击事件冲突的方法

    此博文意在为解决滑动和点击事件的冲突问题提供一种解决思路 如 侧滑删除布局和item的点击事件无法共同有效的问题 解决办法 点击事件不要使用onCLick而是在OnTouch 的MotionEvent ACTION UP中判断 如果左右滑动
  • Android使用ProgressBar实现加载动画

    项目需要做一个加载转圈的效果 给了一张菊花图 首先想到的是使用补间动画的旋转效果 在anim目录中创建loading xml
  • StringBuffer.deleteCharAt()方法

    在和风天气的json数据解析中 数据开头是这样的数据 HeWeather data service 3 0 aqi 这样导致Android Studio 的GsonFormat方法失败 这是因为数据 HeWeather data servi
  • RecycleView的scrollbar在xml中默认显示以及在代码中隐藏

  • android6.0源码分析之Camera API2.0下的初始化流程分析

    在文章android源码分析之Camera API2 0简介中 对Camera API2 0的框架以及代码做了简单介绍 本文将基于android6 0源码 分析Camera API2 0下的Camera2内置应用中 对Camera的初始化的
  • 我所理解的RSA加密算法

    RSA简介 非对称加密算法 有一对公私钥组成 1977年由三位数学家Rivest Shamir 和 Adleman 设计了一种算法 没错RSA是三个人名字的首字母 密钥越长越难破解 1024位目前无法破解 因此1024位的RSA密钥基本安全
  • Camera2拍照时部分机型非常暗

    一 问题描述 1 部分手机在弱光环境下不管什么分辨率 预览和拍出来的照片都非常的暗 2 部分手机在弱光环境下 预览分辨率1920x1080 输出图片分辨率1920x1080时 预览和拍出来的照片亮度比较亮 但是在预览分辨率1920x1080
  • android Camera2 API + TextureView 覆盖用于在相机预览上绘图

    因此 我需要覆盖camera2预览并通过在顶部分层透明覆盖层在预览视频图像上绘制一个矩形 我从这里开始使用基本的 Camera2 代码 https github com googlesamples android Camera2Basic
  • 手电筒相机2 API

    Android Camera2 API 中可以同时使用相机预览和手电筒吗 当我尝试使用时CameraManager setTorchMode String cameraId boolean enabled 当相机未打开时它工作正常 但是当相
  • Android 5.x 快门速度

    我正在尝试获取受支持的快门速度参数 但我现在确定如何获取这些范围 对于 ISO 值 String supportIsoValues camParams get iso values 支持的值 逗号分隔的字符串 System out prin
  • Android Camera2 API - 检测我们何时获得焦点

    因此 我设法用旧相机按照我想要的方式创建了我想要的功能 使用 mCamera autoFocus autoFocusCallback 我检测何时获得焦点并在预览模式下运行所需的代码 现在我很难掌握如何在camera2 API 中执行相同的操
  • 在 Android 上访问高 fps 相机

    有些手机官方支持高 fps 录制 例如 Galaxy S5 和 S6 我尝试了两者 两者都可以使用默认相机应用程序录制高 fps 视频 60 甚至 120 fps 或者在 S6 上使用 Gear VR 的 直通相机 功能 但是 当您通过标准
  • Camera2 API - 如何设置长曝光时间

    我正在尝试在我的应用程序中以 30 秒的曝光时间捕获图像 我知道这是可能的 因为库存相机允许这样做 但是 SENSOR INFO EXPOSURE TIME RANGE 应该以纳秒为单位 给了我范围 13272 869661901 几秒钟后
  • 如何在android中录制视频的同时在视频上绘图,并保存视频和绘图?

    我正在尝试开发一款应用程序 允许我在录制视频时在视频上绘图 然后将录制内容和视频保存在一个 mp4 文件中以供以后使用 另外 我想使用camera2库 特别是我需要我的应用程序在高于API 21的设备上运行 并且我总是避免使用已弃用的库 我
  • Android Camera2 API - 实时显示处理后的帧

    我正在尝试创建一个实时处理相机图像并将其显示在屏幕上的应用程序 我正在使用camera2 API 我创建了一个本机库来使用 OpenCV 处理图像 到目前为止 我已经成功设置了一个 ImageReader 来接收 YUV 420 888 格
  • Android Camera2 API 预览有时会失真

    我正在使用 Camera2 API 构建自定义相机 到目前为止 除了预览有时会失真之外 相机工作得很好 假设我连续打开相机 7 次 所有尝试均成功 但第 8 次相机预览失真 看起来它使用宽度作为高度 反之亦然 我的代码基于camera2的G

随机推荐

  • 1.编译时常量:const

    编译时常量只能在函数之外定义 就可以在编译期间初始了 不能定义在函数方法内 修饰符const不适用于 局部变量 const val PI 3 1415 定义编译时常量 TODO 10 Kotlin语言的编译时常量 编译时常量只能是常用的基本
  • SpringBoot项目多环境配置(亲测有效)

    SpringBoot项目多环境配置 SpringBoot项目在多环境配置上表现的非常优秀 只需要非常简单的操作就可以完成配置 一 认识配置文件 在创建项目后 会看到一个resources目录下有一个application propertie
  • React(6.5)路由系统

    路由系统 单页应用 SPA 的多页面切换 需要使用到路由功能 多个组件的路由和切换 使用路由 React中默认没有安装路由 需要手动安装 安装不指定版本默认是最新版本6 目前大多数项目可能还处于版本5 安装5版本npm install re
  • PCI 原理

    http baike baidu com link url sTevLlZN HI7Ls3 xbui2IvQBjNlTYst1MELXXmChISxZ55VMocg NdNwnCctbLa8RMIDWBw5PxY uvAxhUQ4E8vg8
  • 成功解决FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\DELL\\Anaconda3\\pkgs\\conda

    pycharm导入包总是报错如下 然后查了一下资料发现好像是源的问题 换个源试了一下好了 指令如下 pip install i https pypi tuna tsinghua edu cn simple trusted host pypi
  • Redis高级

    目录 redis介绍安装 介绍 安装 通用命令 五大数据类型 字符串 哈希 列表 集合 有序集合 高级用法 慢查询 pipline与事务 发布订阅 Bitmap HyperLogLog GEO地理位置信息 持久化 RDB方法 AOF方案 r
  • 地址映射与共享

    跟踪地址映射过程 1 通过命令 dbg asm启动调试器 在linux 0 11运行test c文件 使其进入死循环 我们的任务就是找到i的地址并将其修改为0使test c程序退出循环 2 在命令行输入crit c使Boch暂停 一般会显示
  • Selenium Python 自动化搭建及简单用例编写

    1 首先确定自己的浏览器的当前版本号 2 下载对应版本驱动 http chromedriver storage googleapis com index html 下载完成后直接复制到py的目录下 3 调用 简单三行代码就可以简单实现我们的
  • LeetCode 98. 验证二叉搜索树(C++)

    1 题目如下 给你一个二叉树的根节点 root 判断其是否是一个有效的二叉搜索树 有效 二叉搜索树定义如下 节点的左子树只包含 小于 当前节点的数 节点的右子树只包含 大于 当前节点的数 所有左子树和右子树自身必须也是二叉搜索树 示例 1
  • uni-app项目中使用scss语法

    最近正在学习uni app开发 我先把文档浅略翻了遍 发现组件和接口几乎都是按照微信小程序走 但是视图层上的语法又是按照vue的语法走的 所以开发过程一定要注意这点 然后我想在uni app项目中使用scss语法 但是具体怎么安装呢 历经曲
  • 优秀的内存规划方法——环形缓冲区(ring buffer)

    目录 什么是环形缓冲区 使用环形buffer的好处 环形buffer的使用场景 进程间通信 网络IO 区分缓冲区是满或者是空 计数 保持一个存储单元为空 镜像指示位 buffer满了之后的操作 实时流 存储流 什么是环形缓冲区 线性缓冲区
  • 数据库初级入门sqlite3版本

    0 数据库大纲 数据库是什么 如何在在命令行使用SQL语句操作数据库 如何在C C 程序中操作数据库 1 数据库和数据库管理系统及数据库系统 数据库是一个存储数据 电子化表格 的仓库 数据库 简单来说可以看做是一个电子化的文件柜 gt 存储
  • vue element select下拉框树形多选

    components 文件下新建 SelectTree文件 index vue SelectTree index vue
  • 中关村十大AI研究院

    雷刚 发自 凹非寺 量子位 报道 公众号 QbitAI 不知你是否有同样的困惑 最近 秋季校招正在接近尾声 但意外不少非应届同学也关注起未来实习的话题 对于有志于投身AI研发的同学 有没有一些既能发论文 又贴进产业前沿 还比较近的实习机构
  • Unity3D的四种坐标系

    1 World Space 世界坐标 我们在场景中添加物体 如 Cube 他们都是以世界坐标显示在场景中的 transform position可以获得该位置坐标 2 Screen Space 屏幕坐标 以像素来定义的 以屏幕的左下角为 0
  • Wireshark抓包及DNS报文分析

    Wireshark抓包及DNS报文分析 来来来 点我进行5分钟视频学习 冲冲冲 一 抓包整体描述 第一行 帧Frame 2 指的是要发送的数据块 其中 所抓帧的序号为2 捕获字节数等于传送字节数 696字节 第二行 以太网 有线局域网技术
  • java正则表达式的语法详解及常用方法

    一 实例 今天在实现一个功能时遇到了这样一个问题 及接口传过来一个字符串 我需要判断它是一个区间还是一段文字并对其做分别处理 这里面的问题就在于我怎么去判断区间 按照数学规律区间可分为以下几种情况 M M N N N M N M N N N
  • 计算机网络重点知识(期末考研复习)

    点个关注 更多精彩持续更新为考研和期末助力 一起加油 计算机网络 第一章 思维导图 概述 计算机网络的主要性能指标 计算机网络的体系结构 OSI RM模型 TCP IP 两种模型对比 第二章 思维导图 数据通信主要指标与信道极限容量 多路通
  • java8新特性学习笔记

    使用lambda表达式排序 Collections sort temp String a String b gt return b compareTo a Collections sort temp String a String b gt
  • Camera2拍照时部分机型非常暗

    一 问题描述 1 部分手机在弱光环境下不管什么分辨率 预览和拍出来的照片都非常的暗 2 部分手机在弱光环境下 预览分辨率1920x1080 输出图片分辨率1920x1080时 预览和拍出来的照片亮度比较亮 但是在预览分辨率1920x1080