public class

MeteringPoint

extends java.lang.Object

 java.lang.Object

↳androidx.camera.core.MeteringPoint

Gradle dependencies

compile group: 'androidx.camera', name: 'camera-core', version: '1.2.0-alpha01'

  • groupId: androidx.camera
  • artifactId: camera-core
  • version: 1.2.0-alpha01

Artifact androidx.camera:camera-core:1.2.0-alpha01 it located at Google repository (https://maven.google.com/)

Overview

A MeteringPoint is used to specify a region which can then be converted to sensor coordinate system for focus and metering purpose.

Conceptually, a MeteringPoint is a opaque handle to a metering point created by a MeteringPointFactory, for use when building a FocusMeteringAction. The coordinates of the point are specified by the application when creating points from the factory, and then the coordinates are converted into an internal representation stored by this class. Because of the nature of internal representation, the X and Y of the MeteringPoint is not publicly visible. These are for internal use only.

When a FocusMeteringAction is submitted via CameraControl.startFocusAndMetering(FocusMeteringAction), the MeteringPoint is converted to a point in the sensor coordinate system where it defines the center of a metering rectangle. If zoom is applied via CameraControl , it will set a crop region calculated by the zoom and the final coordinates will be mapped into the crop region. If not set, it is mapped to the sensor active array.

Besides defining the center point of the metering rectangle, there is also the size of the MeteringPoint. The size of the MeteringPoint ranges from 0 to 1.0. The size is the percentage of sensor width and height (or crop region width/height if crop region is set). See formula below:

Metering rectangle width = size * sensorSizeOrCropRegion.width
 Metering rectangle height = size * sensorSizeOrCropRegion.height
 
The metering rectangle defined by the MeteringPoint has the same shape as the sensor array.

Summary

Methods
public floatgetSize()

Size of the MeteringPoint width and height (ranging from 0 to 1).

public RationalgetSurfaceAspectRatio()

Get aspect ratio of the output to be adjusted for final sensor coordinates.

public floatgetX()

center X of the region in current normalized surface coordinate system.

public floatgetY()

center Y of the region in current normalized surface coordinate system.

from java.lang.Objectclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Methods

public float getX()

center X of the region in current normalized surface coordinate system. (ranging from 0 to 1).

public float getY()

center Y of the region in current normalized surface coordinate system. (ranging from 0 to 1).

public float getSize()

Size of the MeteringPoint width and height (ranging from 0 to 1). It is the percentage of the sensor width/height (or crop region width/height if crop region is set).

Crop region is set when zoom is set in CameraControl and it is the region inside the sensor active array and it defines the output region of the sensor. See formula below:

Metering rectangle width = size * sensorSizeOrCropRegion.width
 Metering rectangle height = size * sensorSizeOrCropRegion.height
 

public Rational getSurfaceAspectRatio()

Get aspect ratio of the output to be adjusted for final sensor coordinates.

SurfaceAspectRatio is used when the output is not preview. Because not every output has the same aspect ratio as the sensor array, the output image could be cropped by the rule . Therefore in order to correctly convert a normalized (x, y) of a certain to the sensor pixel array, we need to know the aspect ratio of the . For most cases Preview Surface is used because normally user will focus and metering on a area from preview. Having surfaceAspectRatio allows us to have the flexibility to support different aspect ratios of other UseCase. For example, apps might want to focus on some area when analyzing images in ImageAnalysis. If surfaceAspectRatio is null, then Preview aspect ratio will be used. Otherwise, use the specified surfaceAspectRatio.

Source

/*
 * Copyright 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package androidx.camera.core;

import android.util.Rational;

import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;

/**
 * A {@link MeteringPoint} is used to specify a region which can then be converted to sensor
 * coordinate system for focus and metering purpose.
 *
 * <p>Conceptually, a {@link MeteringPoint} is a opaque handle to a metering point created by a
 * {@link MeteringPointFactory}, for use when building a {@link FocusMeteringAction}. The
 * coordinates of the point are specified by the application when creating points from the
 * factory, and then the coordinates are converted into an internal representation stored by this
 * class. Because of the nature of internal representation, the X and Y of the
 * {@link MeteringPoint} is not publicly visible. These are for internal use only.
 *
 * <p>When a {@link FocusMeteringAction} is submitted via
 * {@link CameraControl#startFocusAndMetering(FocusMeteringAction)}, the {@link MeteringPoint} is
 * converted to a point in the sensor coordinate system where it defines the center of a metering
 * rectangle. If zoom is applied via {@link CameraControl} , it will set a crop region calculated
 * by the zoom and the final coordinates will be mapped into the crop region. If not set, it is
 * mapped to the sensor active array.
 *
 * <p>Besides defining the center point of the metering rectangle, there is also the size of the
 * {@link MeteringPoint}. The size of the {@link MeteringPoint} ranges from 0 to 1.0.
 * The size is the percentage of sensor width and height (or crop region width/height if
 * crop region is set). See formula below:
 * <p><pre>Metering rectangle width = size * sensorSizeOrCropRegion.width
 * Metering rectangle height = size * sensorSizeOrCropRegion.height
 * </pre>
 * The metering rectangle defined by the {@link MeteringPoint} has the same shape as the sensor
 * array.
 */
@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class MeteringPoint {
    private float mNormalizedX;
    private float mNormalizedY;
    private float mSize;
    @Nullable
    private Rational mSurfaceAspectRatio; // null for preview aspect ratio.

    /**
     * Constructor is restricted for use within library.
     *
     * @param normalizedX        center X of the region in current normalized coordinate
     *                           system. (ranging from 0 to 1).
     * @param normalizedY        center Y of the region in current normalized coordinate
     *                           system. (ranging from 0 to 1).
     * @param size               size of the MeteringPoint width and height (ranging from 0 to
     *                           1). It is the percentage of the sensor width/height (or crop
     *                           region width/height if crop region is set).
     * @param surfaceAspectRatio If not null, use this as the Surface aspect ratio. Otherwise
     *                           use Preview's aspect ratio.
     */
    MeteringPoint(float normalizedX, float normalizedY, float size,
            @Nullable Rational surfaceAspectRatio) {
        mNormalizedX = normalizedX;
        mNormalizedY = normalizedY;
        mSize = size;
        mSurfaceAspectRatio = surfaceAspectRatio;
    }

    /**
     * center X of the region in current normalized surface coordinate system. (ranging from 0 to
     * 1).
     *
     * @hide
     */
    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
    public float getX() {
        return mNormalizedX;
    }

    /**
     * center Y of the region in current normalized surface coordinate system. (ranging from 0 to
     * 1).
     *
     * @hide
     */
    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
    public float getY() {
        return mNormalizedY;
    }

    /**
     * Size of the MeteringPoint width and height (ranging from 0 to 1). It is the percentage of
     * the sensor width/height (or crop region width/height if crop region is set).
     *
     * <p>Crop region is set when zoom is set in {@link CameraControl} and it is the region
     * inside the sensor active array and it defines the output region of the sensor.  See
     * formula below:
     *
     * <p><pre>Metering rectangle width = size * sensorSizeOrCropRegion.width
     * Metering rectangle height = size * sensorSizeOrCropRegion.height
     * </pre>
     */
    public float getSize() {
        return mSize;
    }

    /**
     * Get aspect ratio of the output {@link android.view.Surface} to be adjusted for final sensor
     * coordinates.
     *
     * <p>SurfaceAspectRatio is used when the output {@link android.view.Surface} is not preview.
     * Because not every output {@link android.view.Surface} has the same aspect ratio as the
     * sensor array, the output image could be cropped by the
     * <a href="https://source.android.com/devices/camera/camera3_crop_reprocess">rule</a>
     * . Therefore in order to correctly convert a normalized (x, y) of a certain
     * {@link android.view.Surface} to the sensor pixel array, we need to know the aspect ratio
     * of the {@link android.view.Surface}. For most cases Preview Surface is used because
     * normally user will focus and metering on a area from preview. Having surfaceAspectRatio
     * allows us to have the flexibility to support different aspect ratios of other
     * {@link UseCase}. For example, apps might want to focus on some area when analyzing images
     * in {@link ImageAnalysis}. If surfaceAspectRatio is null, then Preview aspect ratio will be
     * used. Otherwise, use the specified surfaceAspectRatio.
     *
     * @hide
     */
    @Nullable
    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
    public Rational getSurfaceAspectRatio() {
        return mSurfaceAspectRatio;
    }
}