我是靠谱客的博主 清秀板栗,最近开发中收集的这篇文章主要介绍Android Camera2 对焦梳理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Android Camera2 对焦梳理

对焦的原理

通过相机镜头中镜片组的前后移动,改变像距的位置,使物像恰好落在底片或感光底片上。

焦点(focus)

平行光线射入凸透镜时,镜头将所有的光线聚集在一点,这个点,就叫做焦点;焦点和镜片光学中心的距离叫做焦距。
在这里插入图片描述
在这里插入图片描述
对于我们照相机来说,照相机的镜头就是一个凸透镜,胶片或者感光底片就是屏幕,它也符合凸透镜成像的原理。

凸透镜成像公式:
1/u + 1/v = 1/f
u:指物距,即物体到透镜组中心的距离
v:指像距,即成像至中心的距离
f:焦距

变焦(zoom)

是指改变焦距f。只有变焦镜头的焦距才能被改变,定焦镜头的焦距是固定的。
事实上,相机的镜头是由多片凸透镜和凹透镜组成,但从成像结果来看,可以把这一组镜头看成一个凸透镜。
变焦最直观的感受就是被摄物体在取景器离被放大或者缩小了。

调焦/对焦(focus)

指改变像距,也就是改变镜头光心到底片平面的位置。
光心是指光学中心。

“焦点对在xxx上面(Focus on xxx)”这个习惯说法(也即“合焦”),是指通过“调焦”,即改变像距v,使之与景物xxx到镜头的距离u、镜头焦距f,满足成像公式 1/u + 1/v = 1/f,也就是景物xxx能在底片上清晰成像。

相机的成像是在像平面,而不是在焦平面,调焦调的是感光元件离透镜光心的距离,使得感光元件与像平面重合。
在理想情况下,我们希望是通过凸透镜成像,都能成在一个点上,但是实际情况不是这样的,平行光通过一个凸透镜,根本就不是汇聚到一个点,而是越靠近中轴西安的光束聚焦得越远,越靠近透镜边缘的光聚集得越近,这其实是光学误差的一种,叫球差:

在这里插入图片描述

那么,在实际情况下,有那么多个光线和中轴线交汇的点,那么哪个是焦点/焦平面?
实际上,每个光线和中轴交汇的点都是焦点,所以焦平面也不止一个。
在所有的光线的焦点中,一般情况下,我们重点看两条:一条是聚焦在最远处的,叫近轴焦点,另一条是聚焦在最近处的,叫边缘光线焦点。

对于像平面,一般感光器件在哪里,像平面就在哪里。但是正常情况下,会把像平面放在焦点附近,因为那里的成像相对清晰。具体是放在近轴焦点还是边缘光线焦点,还是放在二者之间的某个位置,就要看你是希望得到最终的光斑大小最小呢,还是均方根光斑大小最小等等一些判据的。

所以对焦的关键还是需要满足这个公式:
1/u + 1/v = 1/f

当被摄物体在无限远处时,我们的成像就在焦平面,此时像距无限趋紧焦平面,也就是像距=焦距。

离焦平面前后越远的物体,成像也就越模糊。

Android 中有关Camera2的对焦API

CONTROL_AF_MODE

当前是否开启自动对焦,以及设置它的模式。
它只有在 android.control.mode = AUTO 和镜头没有固定焦距(i.e android.lens.info.minimumFocusDistance > 0)的情况下,才有用。
当aeMode 为 OFF时,AF的行为取决了设备。

建议在将android.control.aeMode设置为OFF之前使用android.control.afTrigger锁定AF,或者在AE关闭时将AF模式设置为OFF。
它的值有:

  1. OFF:自动对焦程序不再控制镜头;foucusDistance 由application控制。
  1. AUTO:基本自动对焦模式。在这个模式中,镜头不会移动,除非 autofocus trigger 被触发。当 trigger是activated的时候,AF的状态将转换为ACTIVE_SCAN,然后出 scan的结果(FOCUSED or NOT_FOCUSED) 如果镜头没有固定焦距,所有设备都支持。
  1. MACRO:特写聚焦模式。在这个模式中,镜头不回移动,除非autofocus trigger 的行为被调用。 当 trigger 被触发后,AF的状态将转换为ACTIVE_SCAN,然后出扫描结果(FOCUSED or NOT_FOCUSED)。这个模式对那些离镜头很近的物体的对焦进行优化。也就是微距。
  1. CONTINUOUS_VIDEO:在该模式中,AF算法连续地修改镜头位置以尝试提供恒定对焦的图像流。
    The focusing behavior should be suitable for good quality video recording; typically this means slower focus movement and no overshoots. When the AF trigger is not involved, the AF algorithm should start in INACTIVE state, and then transition into PASSIVE_SCAN and PASSIVE_FOCUSED states as appropriate. When the AF trigger is activated, the algorithm should immediately transition into AF_FOCUSED or AF_NOT_FOCUSED as appropriate, and lock the lens position until a cancel AF trigger is received.
    一旦收到取消,算法应转换回INACTIVE并恢复被动扫描。 请注意,此行为与CONTINUOUS_PICTURE不同,因为必须立即取消正在进行的PASSIVE_SCAN。

  2. CONTINUOUS_PICTURE:在该模式中,AF算法连续地修改镜头位置以尝试提供恒定对焦的图像流。
    The focusing behavior should be suitable for still image capture; typically this means focusing as fast as possible. When the AF trigger is not involved, the AF algorithm should start in INACTIVE state, and then transition into PASSIVE_SCAN and PASSIVE_FOCUSED states as appropriate as it attempts to maintain focus. When the AF trigger is activated, the algorithm should finish its PASSIVE_SCAN if active, and then transition into AF_FOCUSED or AF_NOT_FOCUSED as appropriate, and lock the lens position until a cancel AF trigger is received.

  • 4,5的区别就是,4的对焦过程中焦点的移动较慢,5的对焦的过程的尽可能的快。
  1. EDOF:扩展景深(数字对焦)模式。相机设备将自动生成具有扩展景深的图像; 在拍照之前不需要进行特殊的聚焦操作。AF trigger 被忽略,而且AF的状态一直是INACTIVE。
    用简单的语言表达就是:用数字技术模拟光学的对焦系统。
    主要功能:
  2. 大景深 20cm - infinity 整个距离范围内都能实现清晰图像,优于AF
  3. barcode几名片扫面功能 15cm -15cm 可以用OCR识别,兼容AF的微距功能
  4. 低照度功能,可以在低照度下拍摄噪点很小的图片
  5. 用简单的类似定焦镜头的结构来实现低成本 与AF相比,无需驱动马达,尺寸小成本低

EDoF 扩展景深技术的原理和效果

CONTROL_AF_SATE

自动对焦算法现在的状态。
当改变和开启自动对焦模式时,总会重置 AF 的状态为INACTIVE。
同样的,当改变CONTROL_MODE 或 当CaptureRequest#CONTROL_MODE == USE_SCENE_MODE时改变CaptureRequest#CONTROL_SCENE_MODE ,也会重置AF的状态为INACTIVE。

状态的结果是针对于这一帧图像的(与这帧图像同步):如果AF状态变为FOCUSED,则与该结果相关联的图像数据应该是清晰的。

  1. INAVTIVE:AF是off,或者还没有打算去 scan
  1. PASSIVE_SCAN:AF当前正在执行AF扫描,以连续自动对焦模式启动相机设备。只有用于CONTINUOUS_* AF modes,才会出现此状态。这是一个瞬间的状态,相机设备在捕获结果中可以跳过报告此状态。
  1. PASSIVE_FOCUSED:AF目前认为它已经聚焦,但随时可能重新开始扫描。只有用于CONTINUOUS_* AF modes,才会出现此状态。这是一个瞬间的状态,相机设备在捕获结果中可以跳过报告此状态。
  1. ACTIVE_SCAN:AF正在执行AF scan。只有用于AUTO or MACRO AF modes,才会出现此状态。这是一个瞬间的状态,相机设备在捕获结果中可以跳过报告此状态。

  2. FOCUSED_LOCKED:AF认为它是正确聚焦并锁定焦点。镜头将保持静止,直到AF mode改变或者一个新的AF trigger 触发

  3. NOT_FOCUSED_LOCKED:AF无法成功聚焦并锁定焦点。镜头将保持静止,直到AF mode改变或者一个新的AF trigger 触发

  4. PASSIVE_UNFOCUSED:AF在没有找到焦点的情况下完成被动扫描,并且可以随时重新开始扫描。只有用于CONTINUOUS_* AF modes,才会出现此状态。这是一个瞬间的状态,相机设备在捕获结果中可以跳过报告此状态。

  • LEGACY camera devices do not support this state. When a passive scan has finished, it will always go to PASSIVE_FOCUSED.

CONTROL_AF_REGIONS

List of metering areas to use for auto-focus.
如果android.control.maxRegionsAf 为0 ,将不可用。
通过android.control.maxRegionsAf 可以得到设备所支持的最大对焦区域数量。
对于不支持android.distortionCorrection.mode 这个的设备来说,坐标系始终遵循android.sensor.info.activeArraySize的坐标系,其中(0,0)是活动像素数组中的左上角像素,(android.sensor.info.activeArraySize.width - 1,android.sensor .info.activeArraySize.height - 1)是活动像素阵列中的右下角像素。
对于支持android.distortionCorrection.mode的设备来说,坐标系取决于mode的设置。当失真校正模式为OFF时,坐标系遵循android.sensor.info.preCorrectionActiveArraySize,其中(0,0)是预校正活动数组的左上角像素,(android.sensor.info.preCorrectionActiveArraySize.width - 1,android.sensor。 info.preCorrectionActiveArraySize.height - 1)是预校正有源像素阵列中的右下角像素。
当失真校正模式不是OFF时,坐标系遵循android.sensor.info.activeArraySize,其中(0,0)是活动数组的左上角像素,(android.sensor.info.activeArraySize.width - 1,android.sensor.info.activeArraySize.height - 1)是活动像素阵列中的右下角像素。
If the metering region is outside the used android.scaler.cropRegion returned in capture result metadata, the camera device will ignore the sections outside the crop region and output only the intersection rectangle as the metering region in the result metadata. If the region is entirely outside the crop region, it will be ignored and not reported in the result metadata.
权重必须在[0,1000]以内,而且代表的是这个区域中每个像素的权重。在 metering result 中,相同权重的 更大的mertring aream 比 较小的区域有更多影响。metering 区域可以重叠,而且相机设备会叠加重叠区域的权重。
权重是相对于其他计量区域的权重,因此如果仅使用一个区域,则所有非零权重将具有相同的效果。 忽略0权重的区域。
这个权重是设置在MeteringRectangle中的。

对焦区域

  • 广域对焦:相机将对出现在取景器中的所有取景范围内的物体进行自定对焦,通常会选择对距离镜头最近的主体进行对焦。推荐在主体比较考前或者对对焦精度要求不高且相机快速做出对焦判断的情况下使用。
  • 区:对取景器画面中的一部分区域内的物体进行自动对焦的模式。它的对焦范围比较大,合适主体比较突出,在画面中位置比较集中的时候使用。
  • 中心和自由点对焦:对多有自动对焦点中的某一个点进行选取。中心,就是选取处于对焦屏中最中心的那个点。合适静物拍摄,对对焦精度有很高的要求下使用。

CONTROL_AF_TRIGGER

是否在这次请求中触发自动对焦。
When included and set to START, the camera device will trigger the autofocus algorithm. If autofocus is disabled, this trigger has no effect.
通常,应用程序对于a single capture 应该将此字段设置为START or CANCEL,然后返回变为IDLE。为连续多次捕获指定START意味着一遍又一遍地重新启动AF操作。
它的值:

  1. IDLE:
  2. START:立即触发自动对焦
  3. CANCEL:自动对焦将转为初始状态,并且取消现在的任何active trigger

CONTROL_AF_AVAILABLE_MODES

设备所支持的 对于 android.control.afMode 所支持的自动对焦模式列表。
所有LIMITED 和 FULL模式的相机设备都支持OFF模式,和具有可调焦点单元的所有相机设备(android.lens.info.minimumFocusDistance> 0)将支持AUTO模式。
只有当LEGACY设备支持聚焦到无穷大时(通过将android.lens.focusDistance设置为0.0f),它才会支持OFF模式。

LENS_FOCUS_DISTANCE

从镜头的最前面测量到的最锐焦距平面的所需距离。
此控件可用于在支持MANUAL_SENSOR功能的设备上设置手动对焦,并具有可变焦距镜头(see android.lens.info.minimumFocusDistance)。
0.0 这个值意味着无限远焦点,值集将被限制为[0.0f,android.lens.info.minimumFocusDistance]。
这个字段的设置不会立即生效,并且镜头移动到请求的焦距之前可能需要几帧。当镜头仍在移动时,android.lens.state将设置为MOVING。
LEAGCY 的设备大多数可以设置为0.0
Range of valid values:>= 0

LENS_FOCAL_LENGTH

所需的镜头焦距; 用于光学变焦。
此设置控制相机设备镜头的物理焦距。 改变焦距改变了相机设备的视野,并且通常用于光学变焦。
这个字段的设置不会立即生效,并且镜头移动到请求的焦距之前可能需要几帧。当镜头仍在移动时,android.lens.state将设置为MOVING。
光学变焦在大多数设备上不支持。
Range of valid values: android.lens.info.availableFocalLengths
LENS_OPTICAL_STABILIZATION_MODE
设置拍摄图像时相机设备是否使用光学图像稳定(OIS)。
OIS用于补偿由于捕捉期间相机的小幅移动引起的运动模糊。 与数字图像稳定(android.control.videoStabilizationMode)不同,OIS利用机械元件来稳定相机传感器,从而在相机抖动变得明显之前允许更长的曝光时间。
如果摄像头设备同时支持OIS和数字图像稳定(android.control.videoStabilizationMode),则打开这两种模式可能会产生不良交互,因此建议不要同时启用这两种模式。
不是所有的设备都支持OIS,可以通过 android.lens.info.availableOpticalStabilization 查看
它的值:

  1. OFF
  2. ON

Camera2对焦的状态转换

AF_MODE_AUTO or AF_MODE_MACRO

在这里插入图片描述

对于对焦时状态的转换,相机设备是可以跳过瞬态的,瞬态是指在没有应用干预的情况的下发生状态变化的的状态。
瞬态有:

  • ACTIVE_SCAN
  • INACTIVE
  • PASSIVE_FOCUSED
  • PASSIVE_SCAN
  • PASSIVE_UNFOCUSED

因为瞬态的原因,所以我们在设置手动对焦时,不能由瞬态来决定是否对焦成功或失败。

对于瞬态,相机设备在两个结果之间跳过一个或多个瞬态,也是可以的,例如:

在这里插入图片描述

AF_MODE_CONTINUOUS_VIDEO or AF_MODE_CONTINUOUS_PICTURE

在这里插入图片描述

当在AF_MODE_CONTINUOUS_*(CAF模式)和AF_MODE_AUTO / AF_MODE_MACRO之间切换时,相机设备可以跳过INACTIVE或PASSIVE_SCAN状态。
当触发AF时,要切换模式,将会重新评估AF:
在这里插入图片描述

项目中的实践

录像和预览时:开启自动对焦,仅在华为nova2s上

  1. AF_MODE_AUTO:
    状态变化是从 ACTIVE_SCAN -> INACTIVE -> ACTIVE_SCAN -> FOCUSED_LOCKED

  2. AF_MODE_CONTINUOUS_VIDEO:
    状态变化是从 ACTIVE_SCAN -> INACTIVE -> ACTIVE_SCAN -> FOCUSED_LOCKED

  3. AF_MODE_CONTINUOUS_PICTURE:
    状态变化是 ACTIVE_SCAN -> INACTIVE -> ACTIVE_SCAN -> FOCUSED_LOCKED

  4. AF_MODE_MACRO:
    状态变化是从 ACTIVE_SCAN -> INACTIVE -> ACTIVE_SCAN -> FOCUSED_LOCKED

  5. AF_MODE_EDOF:
    大多数手机不支持

根据对API的解读,在预览时,触发手动对焦,可以将模式设置为auto,录像时,可以设置为CONTINUOUS_VIDEO

拍照/预览

  1. AF_MODE_AUTO:自动
  2. AF_MODE_CONTINUOUS_PICTURE:用于静像拍摄
  3. AF_MODE_MACRO:用于微距模式
  4. AF_MODE_EDOF:用于拍摄风景

使用华为p30拍摄,它支持的模式是:0,1,2,3,4。我就分别对1,2,4进行对比,也就是atuo,marco,picture

在这里插入图片描述

再进行微距拍摄:auto,marco,picture:

在这里插入图片描述远景拍摄:auto,marco,picture

在这里插入图片描述
然后我们看看对焦效果:auto,marco,picture

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

可以看到,对于拍照来说,auto模式的表现,无论是近景还是远景,呈现的效果都差不多,所以在设置手动对焦时,可以将对焦模式设置为auto。

现在,一般手机都不支持EDOF

总结:

  • 点击拍照时:为了尽快对焦且提供恒定的图像流,使用AF_MODE_CONTINUOUS_PICTURE
  • 点击录像时:为了提供稳定的图像流,不会出现太大的波动,使用AF_MODE_CONTINUOUS_VIDEO
  • 手动对焦时:
    • 一般情况下:使用AF_MODE_AUTO
    • 近景:使用 AF_MODE_MACRO

最后

以上就是清秀板栗为你收集整理的Android Camera2 对焦梳理的全部内容,希望文章能够帮你解决Android Camera2 对焦梳理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部