Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android Camera1中的对焦与测光

Android Camera1中的对焦与测光

作者头像
雪月清
发布于 2020-07-27 15:23:27
发布于 2020-07-27 15:23:27
2K00
代码可运行
举报
文章被收录于专栏:雪月清的随笔雪月清的随笔
运行总次数:0
代码可运行

Android Camera1开发系列连载:

对焦模式

在使用特定的对焦模式的时候,必须确保相机支持该模式,相机支持的对焦模式可以通过Parameters#getFocusMode接口来获取:

常用的对焦模式为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 连续自动对焦caf,预览场景变化时会自动去对焦
Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO 
Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE  
// 单次自动对焦af,下发一次请求则对焦一次
Camera.Parameters.FOCUS_MODE_AUTO

对焦区域

当对焦模式为caf或者af时,可以指定对焦区域,如果未设置,则驱动程序将会自己选择焦点目标,看一张来自官网描述对焦坐标系的图:

如图所示,无论屏幕是横屏还是竖屏,预览视图的中心点坐标都是(0,0),左上角为(-1000,-1000),右下角为(1000,1000)

在计算屏幕坐标系中的UI点击坐标(x,y)到sensor对焦坐标系对焦区域focusRect的时候,还需要考虑预览的旋转角和前置镜像,计算过程大致如下:

设置对焦区域的时候,需要先查询一下可设置对焦区域的最大个数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 返回0的时候表示不支持设置对焦区域,通常都是返回1
// 当返回个数大于1的时候,可以设置对焦区域列表,
// 每个对焦区域可以设置权重,权重范围为1~1000
Parameters#getMaxNumFocusAreas

常见对焦模式的切换场景

  • 单拍时,先对焦再拍照,拍照结束后切换到caf
  • 连拍时,先对焦再拍照,连拍结束后切换到caf
  • 触屏对焦TouchAF后,可以进行锁焦,预览场景变化时再转为caf;或者设置超时机制,3-5s后从af转为caf。不同手机的系统相机中选择的策略不同,主流策略大概就这两种

af切换到caf的时候,需要切换对焦模式和callback,从af切换到caf:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
camera.setAutoFocusMoveCallback(cafCallback);

从caf切换到af:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 三类UI:正在对焦画白框,对焦成功画绿/黄框,失败画红框
// 五种状态IDEL     
// focus is not activeFOCUSING 
// focus is in progressFOCUSING_SNAP_ON_FINISH 
// will take picture after focus finishSUCCESS  
// focus finished and successFAIL     
// focus finished and fails

autoFocusMoving流程:三种状态,两类UI

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 两类UI:moving的时候画白框,对焦成功画绿/黄框,超时直接清除UI
// 三种状态MOVING_START 
// caf startMOVING_END  
// caf endTIMEOUT     
// time out

上面的显示策略对对焦状态的展示是很明晰的,不过现在的主流相机app都不会搞这么复杂,比如我手头的iPhone和小米手机的系统相机就没这么多颜色切换

测光

测光的坐标系和使用流程与对焦是一样的,就不具体描述了。

在TouchAF的时候,测光区域可以和对焦区域一样,也可以区域中心点相同,而框的大小不同,或者对焦区域和测光区域设置为不同区域,这种焦侧分离的功能一般都是在相机app中的专业模式中提供。考虑用户体验选择不同的策略即可

常见测光方式

注:Redmi k30 5G版 系统相机专业模式

点测光:对画面中较小的区域(占整体面积的1.5% - 3%)进行测光,不考虑周边环境亮度,测光点所侦测的画面非常小,结果比较精确。这种测光模式适合用于场景光线反差大,或者主体在画面中所占比例较小的时候使用;

中央重点测光:测光重点放在画面的中心约75%的区域。在光线色差反差较大的情况下,这种测光模式比矩阵测光更容易控制效果;

平均测光:又叫矩阵测光,对画面中整体区域的光线强弱和色彩等情况进行侦测分析后,得到一个平均比较科学的测光值。这种测光模式适合在场景中光线、色彩等反差 不大的情况下使用;

以下面这张照片为例,在逆光场景下展示花瓣的纹路,为了让花瓣显得通透一点,可以采用点测光模式进行拍摄

测光方式的选择依赖于芯片提供支持或者相机Turing实现,在标准api中是没有直接提供相关接口的

该功能多见于系统相机专业模式,一般在第三方的相机类app启动相机预览后,都是默认的中央重点测光。第三方相机要实现测光方式的选择,除了依赖于厂商提供支持外,其实也可以自己研究一套AE权重表然后利用OpenGL来实现

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 雪月清的随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
收藏好了,JS开发须知道的41个小技巧
链接:https://juejin.im/post/6854573212890562573
coder_koala
2020/11/10
5860
收藏好了,JS开发须知道的41个小技巧
Redis 基本数据结构一:字符串
dbsize命令在计算键总数时不会遍历所有键,而是直接获取Redis内置的键总数变量,所以dbsize命令的时间复杂度是O(1)。
CoderJed
2019/03/15
5020
Redis 基本数据结构一:字符串
MySQL误操作数据恢复的简单实践(r11笔记第67天)
前几天有个同事碰到了一个MySQL数据恢复的问题,他运行了一条update语句,结果忘记了加where条件,结果等反应过来已经晚了。我简单确认了下,是否存在备份,没有,是否开启了日志,没有。所以这个恢复无从谈起。 当然后来他也花了些功夫逐条数据修复,事情过去了,数据恢复的重要性,人为操作的重要性就不言而喻了,但是有些时间工作职责还是需要下移。我觉得还是需要好好总结下数据恢复的问题。我会从以下几个方面来谈。 目录 ⊙ 手工恢复数据的简单示例 ⊙使用开源工具恢复数据的配置 ⊙ 使用开源工具
jeanron100
2018/03/21
7840
【python】9个python进阶技巧(实用)
字符串可以利用乘法 不要傻傻的 print (“**************************************”)
读书猿
2024/02/05
1470
js和object的常见操作,持续更新中...
PS: ⚠️不是返回值,是提醒注意事项,除⚠️符号之外的均为返回值 将string类型的数组,进行格式化为object类型的数组 let str = "[{'env': '测试', 'problem': '允许', 'protocol': 'TCP', 'source_port': '修改的数据源数据', 'purpose': '修改的数据', 'source_ip': '修改的数据源数据', 'dest_port': '修改的数据源数据', 'partner': '修改的数据源数据', 'dest_ip
何处锦绣不灰堆
2020/08/28
1.6K0
js和object的常见操作,持续更新中...
开源导入导出库Magicodes.IE 导出教程
通过如上代码片段我们实现 IExporterHeaderFilter 接口,IExporterHeaderFilter以便支持多语言、动态控制列展示等场景
HueiFeng
2020/01/20
7460
手摸手教你用 Storybook 改善组件库的开发
在上一篇文章 《手摸手教你封装跨项目复用的 Vue 组件》 中,介绍了一例用 rollup.js 封装 Vue.js 组件库的实践;限于篇幅和复杂度,其中组件的即时调试预览部分,也同样采用了 rollup 一并配置出来,虽然完全够用,但运行起来稍嫌麻烦,bigger 上感觉也差强人意。
江米小枣
2020/06/15
2K0
Hive的left join、left outer join和left semi join三者的区别
Hive的Join的文档说明地址: https://cwiki.apache.org/confluence/display/Hive/LanguageManual%2BJoins 以下为两个测试数据表建表语句: MySQL use test; DROP TABLE IF EXISTS table1; create table table1( student_no bigint comment '学号', student_name string comment '姓名' ) COMMENT 'test 学生信
学到老
2018/03/19
3K0
浅谈MySQL中的事务隔离级别(r11笔记第86天)
之前写了一篇浅谈事务(一),算是对事务的一个基本认识,今天来简单总结一下事务的隔离级别,虽然是老掉牙的知识点,重温一下还是值得的。 在MySQL中基本有这两种事务隔离级别的设置,默认的RR(Repeatable-Read)和实际中常见的RC(Read-Committed)。两者区别是什么,怎么正确理解,用几个SQL语句就能说明白,就用简单的实验来说明白。 我们开始吧。 首先创建一个测试表test,插入一些数据。 create table test( id int primar
jeanron100
2018/03/21
6730
一次django内存异常排查
Django 作为 Python著名的Web框架,相信很多人都在用,自己工作中也有项目项目在用,而在最近几天的使用中发现,部署Django程序的服务器出现了内存问题,现象就是运行一段时间之后,内存占用非常高,最终会把服务器的内存耗尽,对于Python项目出现内存问题,自己之前处理过一次,所以并没有第一次解决时的慌张,自己之前把解决方法也整理了博客:https://www.cnblogs.com/zhaof/p/10031945.html
coders
2020/07/31
1.2K0
NoSQL学习笔记之——Redis基础
之前练习过一篇NoSQL之Mongodb基础的笔记,这一篇开始练习NoSQL系列的又一重要利器——Redis。 Redis是一个开源的,基于内存并可持久化的日志型、Key-Value数据库,提供多种语言的API,是对传统关系型数据库的重要补充。 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。 在开始介绍之前,请先确保系统环境中已经安装了redis、RedisDesktopManager并开启redis服务。
数据小磨坊
2018/04/12
8460
NoSQL学习笔记之——Redis基础
Elasticsearch分词:内置分词器
"Set the shape to semi-transparent by calling set_trans(5)" 标准分词器(默认使用) 分词结果: set, the, shape, to, semi, transparent, by, calling, set_trans, 5 POST _analyze { "analyzer": "standard", "text": "Like X 国庆放假的" } { "tokens" : [ { "token"
HLee
2020/12/18
2.2K0
Elasticsearch分词:内置分词器
JS开发必须知道的41个技巧【持续更新】
JS是前端的核心,但有些使用技巧你还不一定知道; 本文梳理了JS的41个技巧,帮助大家提高JS的使用技巧; 文章有点长,可以clone下源码,直接撸,源码地址请戳全部源码,原创不易,欢迎star; 序列文章: Vue 开发必须知道的 36 个技巧 React 开发必须知道的 34 个技巧
火狼1
2020/07/21
8590
实操案例二——列表、字典、控制输出字符颜色
图片 #注意应该是在pycharm中会显示成功,python编译器中显示有误 print('\033[0;35m\t\t图书音像勋章\033[m') print('\033[0;35m\t\t----------------------\033[m') print('\033[0;35m\t\t图书音像勋章\t\t专享活动\033[m') print('\033[0;35m\t\t专属优惠\t\t优惠提醒\033[m')
uniQue_cjh
2023/08/13
2030
JavaWeb学习总结——JSP中的九个内置对象
时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。
用户6182664
2019/10/22
9960
LevelDB:使用介绍
Get 接口和 Put 接口比较像,除了 leveldb::ReadOptions 参数是用来控制读操作的,具体见链接指向的代码。
linjinhe
2018/06/06
2.7K0
Golang-Map
map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。
PayneWu
2020/12/18
5490
一个只有99行代码的JS流程框架(二)
前面写了一篇文章,叫《一个只有99行代码的JS流程框架》,虽然该框架基本已经能实现一个流程正常的逻辑流转,但是在分模块应用下还是缺少一定的能力,无法将一个页面中的不同模块很好的连接在一起,于是对之前的框架进行了升级,新增了子流程的概念。
张镇圳
2018/01/15
1.7K1
本想搞清楚ESM和CJS模块的互相转换问题,没想到写完我的问题更多了
目前主流的有两种模块语法,一是Node.js专用的CJS,另一种是浏览器和Node.js都支持的ESM,在ESM规范没有出来之前,Node.js的模块编写使用的都是CJS,但是现在ESM已经逐渐在替代CJS成为浏览器和服务器通用的模块解决方案。
街角小林
2022/11/02
1.9K0
本想搞清楚ESM和CJS模块的互相转换问题,没想到写完我的问题更多了
[793]mysql表分组后取每组前几条数据
需求:按照p_code字段对product表进行分组并取每组的前两条数据 SQL语句:
周小董
2020/05/07
7.1K0
[793]mysql表分组后取每组前几条数据
相关推荐
收藏好了,JS开发须知道的41个小技巧
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验