写点什么

Android Camera 开发系列:设置对焦模式模式

用户头像
小驰嘻嘻
关注
发布于: 2 小时前

你对 android camera 的对焦模式熟悉吗?


知道什么场景下该设置哪种对焦模式吗?


本文针对下面 2 点展开介绍,和大家一起学习~


一、有哪几种对焦模式?

二、如何使用各种对焦模式?


一、有哪几种对焦模式?

1)获取设备支持的对焦模式 Google 为我们提供了查询当前设备支持的对焦模式的接口~


Camera1 获取对焦模式接口:


----- Camera.java


    public String getFocusMode() {        return get(KEY_FOCUS_MODE);    }
复制代码


Camera2 获取对焦模式接口:


----- CameraCharacteristics.java


@PublicKeypublic static final Key<int[]> CONTROL_AF_AVAILABLE_MODES =        new Key<int[]>("android.control.afAvailableModes", int[].class);
复制代码


2)各种对焦模式的介绍这里只介绍常用的几种对焦模式,详解的介绍,可以查看文末附的源码内容。 我们常用的也就下面 4 种对焦模式。


public static final String FOCUS_MODE_AUTO = "auto";public static final String FOCUS_MODE_FIXED = "fixed";public static final String FOCUS_MODE_CONTINUOUS_VIDEO = "continuous-video";public static final String FOCUS_MODE_CONTINUOUS_PICTURE = "continuous-picture";
复制代码


FOCUS_MODE_AUTO:自动对焦,这个只会触发一次对焦,并且是需要在预览开启后,调用 autoFocus 接口后才会触发,像触点对焦、和拍照对焦都可以用到该模式;


FOCUS_MODE_FIXED:定焦,有些摄像头本身不支持对焦;


FOCUS_MODE_CONTINUOUS_VIDEO:录像的时候,可以采用该模式,会持续对焦,设置 parameter 参数后就会生效;


FOCUS_MODE_CONTINUOUS_PICTURE :拍照的时候,可以采用该模式,会持续对焦,设置 parameter 参数后就会生效,对焦速度相对 FOCUS_MODE_CONTINUOUS_VIDEO 会快点;

二、如何使用各种对焦模式?

上面第二点针对 4 种常见的对焦模式,做了简单的介绍,我们也知道,除了 auto 模式,像 FOCUS_MODE_CONTINUOUS_VIDEO、FOCUS_MODE_CONTINUOUS_PICTURE 模式,是在设置 camera parameter 参数后就生效。


下面来看下 google 给我们提供了哪些调用接口:


1)Camera1public final void autoFocus(AutoFocusCallback cb){...}


  public void setFocusMode(String value) {        ...  }
public void setParameters(Parameters params) { ... }
public final void cancelAutoFocus() { ... }
复制代码


2)Camera2request.set(CaptureRequest.CONTROL_AF_MODE, int focusMode);

附:各种对焦模式的介绍?(贴的 Android 源码里面的介绍,写的够详细

)/*** Auto-focus mode. Applications should call {@link* #autoFocus(AutoFocusCallback)} to start the focus in this mode.*/public static final String FOCUS_MODE_AUTO = "auto";


    /**     * Focus is set at infinity. Applications should not call     * {@link #autoFocus(AutoFocusCallback)} in this mode.     */    public static final String FOCUS_MODE_INFINITY = "infinity";
/** * Macro (close-up) focus mode. Applications should call * {@link #autoFocus(AutoFocusCallback)} to start the focus in this * mode. */ public static final String FOCUS_MODE_MACRO = "macro";
/** * Focus is fixed. The camera is always in this mode if the focus is not * adjustable. If the camera has auto-focus, this mode can fix the * focus, which is usually at hyperfocal distance. Applications should * not call {@link #autoFocus(AutoFocusCallback)} in this mode. */ public static final String FOCUS_MODE_FIXED = "fixed";
/** @hide * Normal focus mode. Applications should call * {@link #autoFocus(AutoFocusCallback)} to start the focus in this * mode. */ public static final String FOCUS_MODE_NORMAL = "normal";
/** * Extended depth of field (EDOF). Focusing is done digitally and * continuously. Applications should not call {@link * #autoFocus(AutoFocusCallback)} in this mode. */ public static final String FOCUS_MODE_EDOF = "edof";
/** * Continuous auto focus mode intended for video recording. The camera * continuously tries to focus. This is the best choice for video * recording because the focus changes smoothly . Applications still can * call {@link #takePicture(Camera.ShutterCallback, * Camera.PictureCallback, Camera.PictureCallback)} in this mode but the * subject may not be in focus. Auto focus starts when the parameter is * set. * * <p>Since API level 14, applications can call {@link * #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. * * @see #FOCUS_MODE_CONTINUOUS_PICTURE */ public static final String FOCUS_MODE_CONTINUOUS_VIDEO = "continuous-video";
/** * Continuous auto focus mode intended for taking pictures. The camera * continuously tries to focus. The speed of focus change is more * aggressive than {@link #FOCUS_MODE_CONTINUOUS_VIDEO}. Auto focus * starts when the parameter is set. * * <p>Applications can call {@link #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. * * @see #FOCUS_MODE_CONTINUOUS_VIDEO */ public static final String FOCUS_MODE_CONTINUOUS_PICTURE = "continuous-picture";
复制代码


本人从事 Android Camera 相关开发已有 5 年


目前在深圳上班


欢迎大家关注我的微信公众号“小驰笔记”


大家一起学习交流


---- 2020.01.04 深圳

发布于: 2 小时前阅读数: 3
用户头像

小驰嘻嘻

关注

公众号: 小驰笔记 2021.03.30 加入

14年开始从事Android Camera相关软件开发 做过车载、手机、执法记录仪~

评论

发布
暂无评论
Android Camera开发系列:设置对焦模式模式