Android Camera2 开启自动曝光

首先,打开3A的总开关:

CaptureRequest.Builder builder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);

获取支持的 AE FPS Range:

List<int[]> ae_fps_ranges = new ArrayList<>();
for (Range<Integer> r : characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES)) {
    ae_fps_ranges.add(new int[] {r.getLower(), r.getUpper()});
}
Collections.sort(ae_fps_ranges, new CameraController.RangeSorter());

然后,设置FPS:

builder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, ae_target_fps_range);

最后,根据 Flash_Mode 设置 AE_MODE
在这里插入图片描述

switch(flash_value) {
   case "flash_off":
       builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);
       builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);
       break;
   case "flash_auto":
       // note we set this even in fake flash mode (where we manually turn torch on and off to simulate flash) so we
       // can read the FLASH_REQUIRED state to determine if flash is required
   /*if( use_fake_precapture || CameraController2.this.want_expo_bracketing )
       builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);
   else*/
       builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH);
       //这里FLASH_MODE可以设置为任意值,因为AE_MODE优先级高
       builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);
       break;
   case "flash_on":
       // see note above for "flash_auto" for why we set this even fake flash mode - arguably we don't need to know
       // about FLASH_REQUIRED in flash_on mode, but we set it for consistency...
   /*if( use_fake_precapture || CameraController2.this.want_expo_bracketing )
       builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);
   else*/
       builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
       builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);
       break;
   case "flash_torch":
       builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);
       builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
       break;
   case "flash_red_eye":
       // not supported for expo bracketing or burst
       if( CameraController2.this.burst_type != BurstType.BURSTTYPE_NONE )
           builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);
       else
           builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE);
       builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);
       break;
   case "flash_frontscreen_auto":
   case "flash_frontscreen_on":
   case "flash_frontscreen_torch":
       builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);
       builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);
       break;
}

查看每帧的曝光参数:

CameraCaptureSession.CaptureCallback{
	@Override
	public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
		long capture_result_exposure_time = result.get(CaptureResult.SENSOR_EXPOSURE_TIME);
		long capture_result_sensitivity = result.get(CaptureResult.SENSOR_SENSITIVITY);
	}
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Camera2 API中,自动对焦的坐标是从[-1000, 1000]的范围内进行定义的,其中(0, 0)表示图像的中心。 如果您需要将屏幕上的触摸坐标转换为适合于自动对焦的坐标,可以使用以下代码: ```java private MeteringRectangle[] getFocusAreaRect(float x, float y) { int areaSize = 200; int left = clamp((int) x - areaSize / 2, 0, mTextureView.getWidth() - areaSize); int top = clamp((int) y - areaSize / 2, 0, mTextureView.getHeight() - areaSize); RectF rectF = new RectF(left, top, left + areaSize, top + areaSize); return new MeteringRectangle[]{new MeteringRectangle(rectF, 1000)}; } private int clamp(int value, int min, int max) { return Math.max(min, Math.min(max, value)); } ``` 这个方法将返回一个MeteringRectangle数组,其中包含一个矩形区域,该区域是在屏幕上给定的x和y坐标周围的一个固定大小。在这个例子中,我们使用了一个200x200像素的矩形区域。您可以根据需要更改这个值。 接下来,您可以将这个MeteringRectangle数组传递给CameraCaptureSession的setRepeatingRequest方法,就可以开始自动对焦了。 ```java RectF rectF = new RectF(left, top, left + areaSize, top + areaSize); MeteringRectangle[] meteringRectangle = new MeteringRectangle[]{new MeteringRectangle(rectF, 1000)}; CameraCaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); builder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); builder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START); builder.set(CaptureRequest.CONTROL_AE_REGIONS, meteringRectangle); builder.set(CaptureRequest.CONTROL_AF_REGIONS, meteringRectangle); cameraCaptureSession.setRepeatingRequest(builder.build(), null, backgroundHandler); ``` 这个代码片段将启动自动对焦。请注意,我们使用了CONTROL_AF_TRIGGER_START触发器来开始自动对焦。在对焦完成后,您可以使用相同的代码将触发器设置为CONTROL_AF_TRIGGER_CANCEL,以停止自动对焦。 希望这可以帮助您解决您的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值