Android Camera高级特性——手动对焦

2023-11-10

转自:https://blog.csdn.net/matrix_laboratory/article/details/82871247

Android Camera 系列目录
搭建Camera开发项目
Android Camera API
Camera API使用指南
Camera 高级特性——手动对焦
Android Camera 高级特性——闪光灯、抗闪烁、场景
Camera性能优化
Android Camera2 API
Camera2 API使用指南
Camera2硬件兼容级别
Camera2拉伸问题
Camera2高级特性
Camera2源代码分析
相机模块设计
1. 前言
对焦可以说是相机最基本的功能。
Android Camera提供了多种对焦方式:

FOCUS_MODE_AUTO:个人认为这个名字起的有点随意
FOCUS_MODE_CONTINUOUS_PICTURE : 持续对焦模式,适用于拍照,此模式可调用autoFocus(AutoFocusCallback)
Applications can call autoFocus(AutoFocusCallback) in this mode. If the autofocus is in the middle of scanning, the focus callback will return when it completes. If the autofocus is not scanning, the focus callback will immediately return with a boolean that indicates whether the focus is sharp or not. The apps can then decide if they want to take a picture immediately or to change the focus mode to auto, and run a full autofocus cycle. The focus position is locked after autoFocus call. If applications want to resume the continuous focus, cancelAutoFocus must be called. Restarting the preview will not resume the continuous autofocus. To stop continuous focus, applications should change the focus mode to other modes.1

FOCUS_MODE_CONTINUOUS_VIDEO :持续对焦模式,适用录制视频,对焦比FOCUS_MODE_CONTINUOUS_PICTURE要消极一些,官方文档上说,这是录制视频时最好的选择,因为焦点变化时更加顺滑。此模式可调用autoFocus(AutoFocusCallback)
Since API level 14, applications can call autoFocus(AutoFocusCallback) in this mode. The focus callback will immediately return with a boolean that indicates whether the focus is sharp or not. The focus position is locked after autoFocus call. If applications want to resume the continuous focus, cancelAutoFocus must be called. Restarting the preview will not resume the continuous autofocus. To stop continuous focus, applications should change the focus mode to other modes.

FOCUS_MODE_EDOF : Extended depth of field (EDOF),此模式不能调用autoFocus(AutoFocusCallback)
FOCUS_MODE_FIXED : 适用于超焦距对焦,此模式不能调用autoFocus(AutoFocusCallback)
FOCUS_MODE_INFINITY : 无穷(??)模式,此模式不能调用autoFocus(AutoFocusCallback)
FOCUS_MODE_MACRO :宏观(特写)对焦模式,此模式可调用autoFocus(AutoFocusCallback)
其中前三種是常用的對焦模式。

2. 实现
2.1 默认对焦设置
在前一篇文章《Android Camera API使用指南
》中我提到可以再配置Camera.Parameters中设置对焦类型,这里就不介绍了。

        //对焦方式
        if (focusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
            mParams.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
        }

---------------------

本文来自 微岩 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/matrix_laboratory/article/details/82871064?utm_source=copy 
1
2
3
4
5
6
7
8
2.2 手动对焦实现
2.2.1 最简单的对焦实现
所谓的手动对焦就是用户点击了屏幕的某块区域,需要把相机对焦到用户点击的区域。(又废话了…… -_-||)
一般我们看到文章介绍Camera API1时,通常会说它使用非常简单(当然相对于Camera API2来说),原因是修改Camera的状态非常简单,只要重新配置下Camera.Parameters,然后设置给Camera就OK。最简单的设置步骤是:

    public synchronized void setFocusMode(String focusMode) {

        if (mCameraDevice == null)
            return;

        mParams = mCameraDevice.getParameters();
        List<String> focusModes = mParams.getSupportedFocusModes();
        if (focusModes.contains(focusMode)) {
            mParams.setFocusMode(focusMode);
        }
    }
1
2
3
4
5
6
7
8
9
10
11
上面的对焦实现是非常简单的,切换对焦模式后效果基本没有明显的变化,而且也没有设置对焦区域……(呃~该对焦效果确实生效了…………)

2.2.2 系统相机对焦效果仿真实现
需求分析
首先分析下系统相机的对焦都有哪些效果:

支持用户设置对焦区域,重新设定对焦区域后会触发相机对焦。
重新设定对焦区域后,画面有明显的亮度变化。
第1点很正常,就是预期的对焦效果。
第2点触发图像亮度变化,实际上这已经不是对焦的范畴了,而是测光。从效果上看,系统相机响应手动对焦的同时根据焦点重新测光。

实现方案
通过上面的分析,我们需要设置对焦区域和测光区域,Camera.Parameters中提供了依赖的接口:

getMaxNumFocusAreas:获取支持的对焦区域的个数
setFocusAreas:设置对焦区域列表
getFocusAreas:获取对焦区域列表
getMaxNumMeteringAreas: 获取支持的测光区域的个数
setMeteringAreas:设置测光区域列表
getMeteringAreas:获取测光区域列表
用到的接口就这几个。具体操作如下:

计算对焦和测光区域
Camera中区域是由Camera.Area定义的,用于相机计算自动曝光、自动白平衡、自动聚焦。其中包含两个成员:
    /**
     * Create an area with specified rectangle and weight.
     *
     * @param rect the bounds of the area.
     * @param weight the weight of the area.
     */
    public Area(Rect rect, int weight) {
        this.rect = rect;                    //区域:[-1000, 1000]
        this.weight = weight;            //权重: [1, 1000]
    }

1
2
3
4
5
6
7
8
9
10
11
Area到屏幕的映射如下,坐标(-1000,-1000)代表Camera图像的左上角:


如此就需要把用户点击的屏幕坐标转换为Camera.Area,下面一段简单转换的代码:

            int focusRadius = (int) (radius * 1000.0f);
            int left = (int) (x * 2000.0f - 1000.0f) - focusRadius;
            int top = (int) (y * 2000.0f - 1000.0f) - focusRadius;

            Rect focusArea = new Rect();
            focusArea.left = Math.max(left, -1000);
            focusArea.top = Math.max(top, -1000);
            focusArea.right = Math.min(left + focusRadius, 1000);
            focusArea.bottom = Math.min(top + focusRadius, 1000);
            Camera.Area cameraArea = new Camera.Area(focusArea, 800);
1
2
3
4
5
6
7
8
9
10
添加对焦/测光区域
    List<Camera.Area> meteringAreas;
    List<Camera.Area> focusAreas;
    if (mParams.getMaxNumMeteringAreas() > 0) {
        List<Camera.Area> meteringAreas = new ArrayList<Camera.Area>();
        meteringAreas.add(cameraArea);
    }
    if (mParams.getMaxNumMeteringAreas() > 0) {
        focusAreas = new ArrayList<Camera.Area>();
        focusAreas.add(cameraArea);
    }
    mParams.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
    mParams.setFocusAreas(meteringAreas);
1
2
3
4
5
6
7
8
9
10
11
12
设置对焦策略
            try {
                mCameraDevice.cancelAutoFocus();
                mCameraDevice.setParameters(mParams);
                mCameraDevice.autoFocus(callback);
            } catch (Exception e) {
                LogUtil.e(TAG, "Error: focusAtPoint failed: " + e.toString());
            }
1
2
3
4
5
6
7
上面三个步骤都是必须的,对焦不是瞬间完成,而是一个持续的过程。1

cancelAutoFocus:结束上一次的对焦操作,不管是有没有完成对焦
autoFocus:执行一次对焦操作,通过Camera.AutoFocusCallback返回对焦结果。
至此,一次对焦操作就完成了。

3. 参考文献
Android Camera (https://developer.android.com/reference/android/hardware/Camera#autoFocus(android.hardware.Camera.AutoFocusCallback) ↩︎
————————————————
版权声明:本文为CSDN博主「微岩」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/matrix_laboratory/article/details/82871247

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

Android Camera高级特性——手动对焦 的相关文章

  • 应用程序签名机制

    原文链接 http www 2cto com Article 201308 237263 html Android安全机制分析 Android系统是基于Linux内核开发的 因此 Android系统不仅保留和继承了Linux操作系统的安全机
  • repo遍历所有git仓库

    repo遍历所有git仓库 repo forall c 命令 其中 参数有 c 后面可以带的任何可以被系统支持的shell命令 ls cp pwd等 p 在shell命令输出之前列出项目名称 v 列出执行shell指令输出的错误信息 该命令
  • 内核篇加载内核模块(Android10)

    一 开发前期准备 本文中使用的是linageOs源码中下载的oneplus3 安卓10内核源码进行研究测试 交叉编译链使用的是linageOs源码中的交叉编译链 lineageOs源码中oneplus3内核源码位置路径 home qiang
  • 移植linux开源软件到android系统

    例子 vlc android vlc android jni 目录 写连接vlc core 的jni 代码 vlc目录 configure host arm linux androideabi 生成linux Makefile 后面的编译和
  • Android--Recovery模块之恢复出厂设置

    一 在进行详细流程分析之前 先看一下几个重要概念 一 Recovery的工作需要整个软件平台的配合 从架构角度看 有三个部分 1 Main system 用boot img启动的Linux系统 Android的正常工作模式 2 Recove
  • Tensorflow的Bazel编程(二)

    转自 http blog csdn net langb2014 article details 54312697 安装官网 https bazel build versions master docs tutorial Java html
  • Android 系统865虚拟化集成无源码apk示例

    一 环境 高通865虚拟化Android 10 版本 二 具体修改的文件 以集成OppoAnonymousId apk为例 1 新建OppoAnonymousId目录 将apk放到该目录 vendor qcom proprietary pr
  • 13 Binder通信之ServiceManager

    Binder通信之ServiceManager 一 前言 Android系统中存在很多service 当某个应用调用系统某个service的功能时 往往向系统发出请求 调用该服务的外部接口 这种外部接口我们通常叫做代理接口 也就是说要拿到目
  • 导入android project到 eclipse 出现Unable to resolve target 'android-8'的错误

    今天导入一个Android的例子程序 出现了Unable to resolve target android 8 的错误 刚开始以为是没导入包或者是phoneGap没配置好 可是折腾了好久还是报错 最后google之后才发现原来是ADK版本
  • Android系统 —— 源码编译错误整理(持续更新)

    记录一些日常遇到的编译问题及解决方法 查找的时候可以直接搜索问题描述的关键部分 目录 1 更改源码目录名引发的错误 2 添加VNDK库 Vendor Native Development Kit 报错 3 头文件被重复包含 4 无法链接库文
  • android 进程监控 top

    adb shell top h top h Usage top m max procs n iterations d delay s sort column t h m num Maximum number of processes to
  • Logcat 的常用命令说明

    个人认为有一下几个常用命令 adb logcat c 清除所有以前的日志 adb logcat d 这个命令是在时间上倒过来用的 就是你先操作 然后敲这个命令 打出来的log就是你刚操作那段时间的log 而且自动退出log模式 adb lo
  • Android系统签名介绍

    一 签名原理介绍 apk的签名 简单说开发者可以通过签名 对应用进行标识和更新 包名在一个设备上是唯一的 这样可以避免被相同包名应用随意覆盖安装 这是一个非常重要的安全功能 系统中的签名文件 也是对系统中应用进行签名 编译应用是可以指定签名
  • 任意遥控器遥控C1测试成功,理论上可使用任意遥控

    转自 http bbs letv com thread 35538 1 1 html http bbs letv com thread 65155 1 1 html 任意遥控器遥控C1测试成功 理论上可使用任意遥控 现在测试了乐视随机九键遥
  • 【android系统】android系统升级流程分析(二)---update升级包分析

    接下来我们将通过几篇文章来分析update zip包在具体Android系统升级的过程 来理解Android系统中Recovery模式服务的工作原理 今天让我先来分析下升级包update zip 一 目录结构 update zip包的目录结
  • Android 开机加速优化

    文章目录 Android 开机加速优化 关闭BootLoader的企鹅 关闭开机动画Android 关闭锁屏 删除预装APP 查看预装APP 删除编译生成的APK 不编译APK 1 统一配置 2 修改单个APK的Android mk 谷歌A
  • 使用ANT打包Android应用

    转自 http blog csdn net liuhe688 article details 6679879 大家好 今天来分享一下如何使用ANT打包Android应用 通常我们习惯用eclipse来开发Android程序 它会自动帮我们打
  • Android Property System

    属性系统是android的一个重要特性 它作为一个服务运行 管理系统配置和状态 所有这些配置和状态都是属性 每个属性是一个键值对 key value pair 其类型都是字符串 从功能上看 属性与windows系统的注册表非常相似 许多an
  • android Jar文件的数字签名

    转自 http hubingforever blog 163 com blog static 17104057920118104058241 JAR文件可以用 jarsigner工具或者直接通过 java securityAPI 签名 签名
  • Android下自定义的jar库文件编译和调用

    主要为了解决如下问题 项目中使用了Android未公开的API 在Eclipse下会有红叉显示 不同的项目抽出相同部分的代码共用 必需的前提条件 需要有Android源代码 编译的库文件主要是封装未公开API或者共用代码 工程1 Java库

随机推荐

  • Linux——线程1

    一 线程基础 进程 有独立的进程地址空间 有独立的pcb 线程 有独立的pcb 没有独立的进程地址空间 因此进程线程最本质的区别就是 是否共享地址空间 在Linux下线程是最小的执行单位 进程是最小的分配资源单位 可看成只有一个线程的进程
  • 避坑记录:打电话(uni.makePhoneCall)

    uni makePhoneCall 可兼容微信小程序 H5 移动端 安卓 IOS 但是在移动端 安卓 上 如果拒绝授权电话 则会出现点击号码 既不报错 也不弹出打电话的bug 当然 如果只是简单调用makePhoneCall 也就不值得我去
  • Call Exec in PeopleCode

    我想在Application Engine里加一段调用命令行的代码 All PeopleCode is executed on the application server So if you re calling an interacti
  • 基于imx6ull视频监控

    基于imx6ull视频监控 前言 一 mjpg streamer 1 编译mjpg streamer 2 运行mjpg 3 mjpg框架 二 流媒体 1 ffmpeg 2 nginx服务器 3 实现flv js访问和ip地址访问 4 内网穿
  • MySQL添加用户、删除用户与授权

    前言 MySql中添加用户 新建数据库 用户授权 删除用户 修改密码 注意每行后边都跟个 表示一个命令语句结束 新建用户 登录MYSQL mysql u root p 密码 创建用户 mysql gt insert into mysql u
  • 从iOS App启动速度看如何为基础性能保驾护航

    1 前言 启动是App给用户的第一印象 一款App的启动速度 不单单是用户体验的事情 往往还决定了它能否获取更多的用户 所以到了一定阶段App的启动优化是必须要做的事情 App启动基本分为以下两种 1 1 冷启动 App 点击启动前 它的进
  • python:深拷贝,浅拷贝,赋值引用

    第一部分转载自 https www cnblogs com xueli p 4952063 html 1 python的复制 深拷贝和浅拷贝的区别 在python中 对象赋值实际上是对象的引用 当创建一个对象 然后把它赋给另一个变量的时候
  • purrr 0.2.0

    purrr 0 2 0 Hadley Wickham 2016 01 06 Categories Packages tidyverse 原文地址 我很高兴的发布了purrr 0 2 0 Purrr填补了R的函数式编程工具中的缺失部分 让你的
  • rpm包的卸载与安装

    本文章向大家介绍rpm包的卸载与安装 主要内容包括1 rpm包管理 2 rpm包的简单查询指令 3 卸载rpm包 4 安装rpm包 使用实例 应用技巧 基本知识点总结和需要注意事项 具有一定的参考价值 需要的朋友可以参考一下 目录 1 rp
  • 模式识别课程:目标检测③基于深度学习的检测算法

    title 目标检测 基于深度学习的检测算法 目标检测实验报告 检测所用软硬件 云服务器 硬件 macOS或者windows电脑 软件 pycharm 生成的测试集 云服务器 滴滴云 https www didiyun com activi
  • redisHyperLogLog原理解析

    场景 做服务端的同学 应该都遇到过计数场景 比如我想知道浏览某一个web页面的总人数 总次数 查看某条热门动态的总人数总次数 购买某件商品的总人数总次数 对于总次数我们直接基于计数器累加就能很方便的解决 时间和空间复杂度都不高 而对于总人数
  • fix: Build warning "generate id 'android:id/xxx' for external package 'android'

    other ref https blog csdn net w1070216393 article details 83088054 attr file
  • 【C/C++】哈希

    文章目录 1 unordered系列关联式容器 1 1unordered map接口 1 2unordered set 2 底层原理 2 1顺式结构和平衡树 2 2hash结构 2 3哈希冲突 哈希碰撞 2 4合理的哈希函数 2 4 1常见
  • BatchNorm原理以及PyTorch实现

    BatchNorm算法 简单来说BatchNorm对输入的特征按照通道计算期望和方差 第1和第2个公式 并标准化 第3个公式 减去均值 再除方差 变为均值0 方差1 但这会降低网络的表达能力 因此 BN在标准化后还要进行缩放平移 也就是可学
  • 什么是面向对象的设计思想?

    什么是面向对象的设计思想 什么是面向对象的设计思想 也许有不少初学者对这个概念还有许多不明白的地方 特别是这个处于新旧思想交替的时代 许多人刚刚学完现在看来是快要淘汰的只是面向过程的 语言 他们的脑子还没有脱离面向过程思想的束缚 抬头却发现
  • ⚡文件信息管理模块⚡

    目录 文件信息管理模块介绍 FileInfo类的设计 FileInfoManger类的设计 文件信息管理类 FileInfoManger类的成员变量 成员函数 文件信息管理模块介绍 在云备份服务器上 每一个文件都有一个FileInfo的类对
  • C++数据结构X篇_03_线性表的顺序存储和动态数组案例(基本概念;操作要点;顺序存储算法;动态数组案例实现)

    接上篇C 数据结构X篇 02 线性表基本概念 线性表是零或者多个数据元素的有限序列 有顺序 有限 类型必须相同 线性表是具有相同类型n个数据元素的有限序列 a0 a1 an ai是表项 n是表长度 本篇将会介绍线性表的2种存储方式 顺序存储
  • 60套tensorflow程序源码/人脸/车牌/数字/手势识别/卷积神经网络

    60套tensorflow程序源码 人脸 车牌 数字 手势识别 卷积神经网络 1 carLicense recongnition车牌识别python 2 tensorflow量化demo python 3 python Tensorflow
  • vue中的路由及自定义图标

    效果如图所示 安装vue router npm install vue router save 底部选项卡 使用的是 MUI中的 tab bar 选项卡 下载mui mui https github com dcloudio mui 将其中
  • Android Camera高级特性——手动对焦

    转自 https blog csdn net matrix laboratory article details 82871247 Android Camera 系列目录 搭建Camera开发项目 Android Camera API Ca