观心静

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

前言

  如果你想深入了解如何控制Camera2的各种效果配置你一定要了解CaptureRequest的各种属性的意义,此博客记录一些Camera2的CaptureRequest属性值的个人理解解释与官方注解翻译。如有错误理解请指出说明。我对Camera的研究并不是很深入。(贫穷没有进入过玩单反境界)

CONTROL_AE 控制曝光组

CONTROL_AE_LOCK  锁定当前自动化曝光的值,对应值为true与false

注释部分:

无论是自动曝光(AE)当前被锁定到其最新的计算值。
当设置为true (ON),AE算法被锁定到其最新的参数,并不会改变曝光设置,直到锁被设置为false (OFF)。
需要注意的是,即使当AE锁定,闪光灯可如果解雇android.control.aeMode是ON_AUTO_FLASH / ON_ALWAYS_FLASH / ON_AUTO_FLASH_REDEYE。
当android.control.aeExposureCompensation改变时,即使AE锁定为ON,则相机设备将仍然调整其曝光值。
如果AE precapture被触发(见android.control.aePrecaptureTrigger )当AE已经锁定,相机设备将不改变曝光时间( android.sensor.exposureTime )和灵敏度( android.sensor.sensitivity )的参数。 如果闪光灯可能被触发android.control.aeMode是ON_AUTO_FLASH / ON_AUTO_FLASH_REDEYE场面太黑了。 如果android.control.aeMode是ON_ALWAYS_FLASH,现场可能会变得过度曝光。 同样,AE precapture触发取消了当AE已被锁定没有影响。
当AE precapture序列被触发时,如果AE由相机设备内部precapture计量序列换句话说期间锁定,提交与AE解锁请求具有用于在正在进行的precapture计量序列没有影响AE解锁将不能解锁AE。 否则,precapture计量序列将永远不会在AE锁定总是被设置为预览请求序列成功false 。
由于摄像装置在飞行中要求的管道,这被锁定不一定对应于存在于从相机设备接收最新的拍摄结果的设置的设置,因为额外的捕获和AE更新,甚至可能已经发生前结果被发送出去。 如果应用程序自动和手动控制和愿望之间的切换,以消除开关期间的任何闪烁,建议下面的过程:

  1. 开始在自动曝光模式:
  2. 锁定AE
  3. 等待第一个结果是具有AE锁定输出
  4. 从该结果到一个请求复制的曝光设置,设置请求为手动AE
  5. 提交的捕获请求,按所希望的运行手册AE。

见android.control.aeState为AE锁定相关状态的详细信息。
这关键是适用于所有的设备。

 

CONTROL_AE_EXPOSURE_COMPENSATION   控制AE曝光补偿

注释部分:

调整到自动曝光(AE)的目标图像的亮度。
调整被测量为步骤的计数,与由所限定的步长大小android.control.aeCompensationStep并且由允许范围android.control.aeCompensationRange 。
例如,如果曝光值(EV)的步骤是0.333,“6”将意味着2 EV的曝光补偿; -3将意味着-1 EV的曝光补偿。 一个EV代表图像亮度加倍。 请注意,此控制只会若有效android.control.aeMode != OFF。 这种控制需要,即使效果android.control.aeLock == true 。
在被改变曝光补偿值的情况下,摄像装置可能需要几个帧以到达新请求的曝光目标。 在此期间, android.control.aeState场将在搜索状态。 一旦达到新的曝光对象, android.control.aeState将从SEARCHING更改为融合,锁定(如果AE锁定启用),或FLASH_REQUIRED(如果场景太静态拍摄暗)。
单位 :补偿措施
有效值范围: android.control.aeCompensationRange
这关键是适用于所有的设备。

实际使用:

在上面的注释有说明曝光增益的范围 " 有效值范围: android.control.aeCompensationRange ",根据每个设备曝光范围可能都不一样。在下面的代码里我们获得曝光增益范围 

    /**
     * 获取曝光补偿
     *
     * @param i 0-100 百分比
     * @return
     */
    private int getAe(int i) {
        try {
            CameraCharacteristics cameraCharacteristics = mCameraManager.getCameraCharacteristics(mCurrentCameraId);
            Range<Integer> integerRange = cameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE);
            int min = integerRange.getLower();
            int max = integerRange.getUpper();
            int all = (-min) + max;
            int time = 100 / all;
            int ae = ((i / time) - max) > max ? max : Math.max(((i / time) - max), min);
            return ae;
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
        return 0;
    }

设置它

//相机状态
        mCameraStateCallback = new CameraDevice.StateCallback() {
            @Override
            public void onOpened(@NonNull CameraDevice camera) {
                mCameraDevice = camera;
                try {
                    Size matchingSize = getMatchingSize();
                    initImageReader(matchingSize.getWidth(), matchingSize.getHeight());
                    mSurfaceTexture = mBinding.textureView.getSurfaceTexture();
                    mSurfaceTexture.setDefaultBufferSize(matchingSize.getWidth(), matchingSize.getHeight());
                    mSurface = new Surface(mSurfaceTexture);
                    mCaptureRequest = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
                    mCaptureRequest.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, getAe(0)); //设置曝光补偿
                    mCaptureRequest.addTarget(mSurface);
                    mCaptureRequest.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
                    mCameraDevice.createCaptureSession(Arrays.asList(mSurface, mImageReader.getSurface()), mSessionStateCallback, mChildHandler);
                } catch (CameraAccessException e) {
                    e.printStackTrace();
                    Navigation.findNavController(getView()).navigateUp();
                    ToastUtils.showShortToast("打开相机失败");
                }
            }

//略....

 

COLOR_CORRECTION  色彩校准组

CONTROL_AWB 控制白平衡组


CONTROL_AF 控制自动对焦组


BLACK_LEVEL 黑色水平?



CONTROL_EFFECT 黑白模式?



CONTROL_CAPTURE 捕捉控制组(视频、图片、预览)



JPEG 照片组


JPEG_QUALITY 图片质量

最终JPEG图像的压缩质量。
85-95是典型的使用范围。 这个标签也被用来形容HEIC图像采集的质量。
有效值范围: 1-100; 更大的是更高质量
这关键是适用于所有的设备。

JPEG_ORIENTATION 图片显示方向
取向为JPEG图像。
顺时针旋转角度以度为单位,相对于取向到相机,该JPEG图像需要由被旋转,要观看直立。
摄像机装置可以或者这个值编码成JPEG EXIF标头或旋转图像数据,以匹配该取向。 当图像数据被旋转时,缩略图数据也将被旋转。
请注意,该取向是相对于由下式给出的相机传感器的取向, android.sensor.orientation 。
从由所述的Android传感器的API相机传感器其不是外部,可以使用下面的示例代码中给出的设备取向翻译:
private int getJpegOrientation(CameraCharacteristics c, int deviceOrientation) {
           if (deviceOrientation == android.view.OrientationEventListener.ORIENTATION_UNKNOWN) return 0;
           int sensorOrientation = c.get(CameraCharacteristics.SENSOR_ORIENTATION);
      
           // Round device orientation to a multiple of 90
           deviceOrientation = (deviceOrientation + 45) / 90 * 90;
      
           // Reverse device orientation for front-facing cameras
           boolean facingFront = c.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT;
           if (facingFront) deviceOrientation = -deviceOrientation;
      
           // Calculate desired JPEG orientation relative to camera orientation to make
           // the image upright relative to the device orientation
           int jpegOrientation = (sensorOrientation + deviceOrientation + 360) % 360;
      
           return jpegOrientation;
       }
       
对于EXTERNAL相机的传感器取向将总是被设置为0和表面也将被设置为外部。 上面的代码不是在这种情况下相关的。
此标记也用于描述HEIC图像捕捉,在这种情况下,旋转被反射的取向EXIF orientation flag ,而不是通过旋转图像数据本身。
单位 :度为90的倍数
有效值范围: 0,90,180,270
这关键是适用于所有的设备。

LENS_FACING 摄像头方向组

 

LENS_FACING_BACK
LENS_FACING_EXTERNAL
LENS_FACING_FRONT

 


LENS 镜片组



FLASH 闪光灯组



NOISE_REDUCTION 降噪组



SENSOR  传感器组



STATISTICS_FACE 统计人脸组(人脸检测)


TONEMAP 色调组

 



CONTROL_AE_ANTIBANDING_MODE_AUTO 赫兹自动
CONTROL_AE_ANTIBANDING_MODE_50HZ 赫兹50
CONTROL_AE_ANTIBANDING_MODE_60ZH 赫兹60

单独属性组:


CONTROL_CAPTURE_INTENT 相机设备3A
到相机设备3A(自动曝光,自动对焦,自动白平衡)这个捕获的目的程序,信息,以帮助照相设备,以决定最佳的3A战略。
该控制(除了MANUAL)是唯一有效的,如果android.control.mode != OFF和任何常规3A是活动的。
所有的意图是所有设备都支持,不同之处在于:如果* ZERO_SHUTTER_LAG将支持android.request.availableCapabilities包含PRIVATE_REPROCESSING或YUV_REPROCESSING。 *如果手册将支持android.request.availableCapabilities包含MANUAL_SENSOR。 *如果MOTION_TRACKING将支持android.request.availableCapabilities包含MOTION_TRACKING。
可能的值:
CUSTOM
PREVIEW
STILL_CAPTURE
VIDEO_RECORD
VIDEO_SNAPSHOT
ZERO_SHUTTER_LAG
MANUAL
MOTION_TRACKING
这关键是适用于所有的设备。


CONTROL_ENABLE_ZSL
允许摄像机装置,以使与请求零快门迟滞模式android.control.captureIntent == STILL_CAPTURE。
如果enableZsl是true ,相机设备可以使与STILL_CAPTURE捕获意图请求零快门迟滞模式。 相机设备可以使用所捕获的图像,在过去,以产生输出图像为一个零快门迟滞请求。 包括结果元数据android.sensor.timestamp反映用于产生输出图像的源帧。 因此,输出图像和结果元数据的内容可以是乱序相比以往定期请求。 enableZsl不会影响与其他拍摄意图的请求。
例如,当请求按以下顺序被提交:请求A:enableZsl为ON, android.control.captureIntent是预览请求B:enableZsl为ON, android.control.captureIntent是STILL_CAPTURE
用于请求B的输出图像可能已经内容输出图像用于请求A之前捕获,以及用于请求B中的结果的元数据可以比请求A.结果的元数据的年龄较大的
请注意,当enableZsl是true ,也不能保证得到在以前拍摄与STILL_CAPTURE拍摄意图的请求输出图像。
对于应用程序针对SDK版本O和更新,enableZsl的TEMPLATE_STILL_CAPTURE模板中的值可能是true 。 在其他模板的值总是false ,如果存在。
对于应用程序目标为O旧的SDK版本,enableZsl的所有捕获模板的值总是false ,如果存在。
对于应用程序操作ZSL,使用CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG模板。
可选 -该键的值可能是null在某些设备上。

posted on 2020-08-26 19:52  观心静  阅读(4254)  评论(0编辑  收藏  举报