转自: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

Android Camera高级特性——手动对焦相关推荐

  1. Android Camera了解一下

    首发于公众号 Android Camera了解一下 Camera 演进简介 最近在项目中遇到 Camera相关的场景,之前对这块不是很了解,趁机补了一下盲区.Android Camera 相关也是生态 ...

  2. Camera HAL3学习: Android Camera System

    Android Camera硬件抽象层(HAL,Hardware Abstraction Layer)主要用于把底层camera drive与硬件和位于android.hardware中的framew ...

  3. 【Android RTMP】Android Camera 视频数据采集预览 ( 图像传感器方向设置 | Camera 使用流程 | 动态权限申请 )

    文章目录 安卓直播推流专栏博客总结 一. Camera 传感器方向简介 二. Camera 图像传感器横向显示数据 三. Camera 图像传感器纵向显示数据 四. 设置 Camera 预览数据方向 ...

  4. 【Android RTMP】Android Camera 视频数据采集预览 ( 视频采集相关概念 | 摄像头预览参数设置 | 摄像头预览数据回调接口 )

    文章目录 安卓直播推流专栏博客总结 一. Android 端数据采集涉及到的相关概念 二. Camera 预览图像尺寸设置 三. 获取摄像头采集的数据格式 安卓直播推流专栏博客总结 Android R ...

  5. Visual Studio 2015 速递(4)——高级特性之移动开发

    系列文章 Visual Studio 2015速递(1)--C#6.0新特性怎么用 Visual Studio 2015速递(2)--提升效率和质量(VS2015核心竞争力) Visual Studi ...

  6. Android Camera调用流程

    一个流程图画的非常好的文章 http://blog.csdn.net/lushengchu_luis/article/details/11033095 1.Packages/apps/到framewo ...

  7. Java 高级特性 --- 反射

    From:Java 高级特性 --- 反射:https://www.jianshu.com/p/9be58ee20dee From:Java 基础之 --- 反射(非常重要):https://blog ...

  8. android 通知历史,Android P新特性:追踪应用通知历史

    原标题:Android P新特性:追踪应用通知历史 IT之家3月9日消息 不久前,谷歌已经正式推出了首个Android P开发者预览版,包含了许多新特性.对此,IT之家也进行了一系列报道.该系统的新特 ...

  9. Android Camera(5)---Android Camera调用流程

    Android Camera调用流程 http://blog.csdn.net/lushengchu_luis/article/details/11033095 1.Packages/apps/到fr ...

  10. Android camera(4)---Android Camera开发之基础知识篇

    Android Camera开发之基础知识篇 转自:https://blog.csdn.net/feiduclear_up/article/details/51968975#jump5 概述 Andr ...

最新文章

  1. java遍历bean_javaweb利用javabean将数据库中内容遍历在页面输出
  2. ubuntu上部署svn
  3. 中汽创智科技首席人工智能官丁华杰:AI赋能自动驾驶的几点思考
  4. 互联网大脑的发育与元宇宙的兴起
  5. ZOJ 2334 HDU 1512 Monkey King
  6. MySQL删除关联表的数据
  7. JavaScript中创建对象的方法
  8. hibernate基础工具findBySQL学习
  9. dotNet中初始化器的使用
  10. 数列分块入门 7(LibreOj-6283)
  11. 我的内核学习笔记3:我的platform驱动模板文件
  12. java 只接受post请求_13SpringMvc_限定某个业务控制方法,只允许GET或POST请求方式访问...
  13. win7纯净版64位系统下载
  14. 各大IT公司技术架构一览
  15. 进击zheng项目zheng-umps-server
  16. 亲身经历,大龄程序员找工作,为什么这么难...
  17. 鸿蒙系统一直重启怎么办,我的电脑能开机随后就是进不了系统一直黑在那边,时间长了就自动重启...
  18. ubantu22与windows相互复制粘贴(详细图文)
  19. 初学者入门阿里云haas510开板式DTU(2.0版本)--510-AS
  20. 动物 v.s. AI奥运会:你会赌一只鸟还是机器人夺冠?

热门文章

  1. 美,英,荷文元音及元音组合国际音标对照表
  2. 北京铁路安检全面升级 四大站特警持枪巡逻
  3. 计算机大类专业分流问题,2019级计算机大类专业分流实施细则
  4. 【Week7 作业B】TT的旅行日记
  5. Leetcode #317:离建筑物最近的距离
  6. Win7 每天定时关机
  7. 思杰桌面虚拟化Citrix XenDesktop
  8. 翻译 RFC 7322: RFC 样式指南
  9. eclipse快捷键总结
  10. apache-storm-0.9.6.tar.gz的集群搭建(3节点)(图文详解)