Android Camera2 之 CameraCharacteristics 詳解
一、簡介
CameraCharacteristics 是專門用來描述相機裝置屬性的一個類,繼承自 CameraMetadata
類。給對給定的相機,它裡面所包含的屬性都是 固定的 。
包括:曝光補償(Exposure compensation)、自動曝光/自動對焦/自動白平衡模式(AE / AF / AWB mode)、自動曝光/自動白平衡鎖(AE / AWB lock)、自動對焦觸發器(AF trigger)、拍攝前自動曝光觸發器(Precapture AE trigger)、測量區域(Metering regions)、閃光燈觸發器(Flash trigger)、曝光時間(Exposure time)、感光度(ISO Sensitivity)、幀間隔(Frame duration)、鏡頭對焦距離(Lens focus distance)、色彩校正矩陣(Color correction matrix)、JPEG 元資料(JPEG metadata)、色調對映曲線(Tonemap curve)、裁剪區域(Crop region)、目標 FPS 範圍(Target FPS range)、拍攝意圖(Capture intent)、硬體視訊防抖(Video stabilization)等。
官方文件連結:https://developer.android.google.cn/reference/android/hardware/camera2/CameraCharacteristics
二、獲取 CameraCharacteristics 示例
通過 CameraManager
的 getCameraCharacteristics(String cameraId)
方法獲取指定相機裝置的 CameraCharacteristics 物件。
private int mCameraId = CameraCharacteristics.LENS_FACING_FRONT; // 要開啟的攝像頭ID
private CameraManager mCameraManager; // 相機管理者
private CameraCharacteristics mCameraCharacteristics; // 相機屬性
public void openCamera() {
try {
mCameraCharacteristics = mCameraManager.getCameraCharacteristics(Integer.toString(mCameraId));
StreamConfigurationMap map = mCameraCharacteristics. get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
// ...省略
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
三、內部類
包含一個 CameraCharacteristics.Key<T>
的內部類,用做相機特性的欄位查詢使用。
常搭配 CameraCharacteristics.get(CameraCharacteristics.Key<T> key)
方法使用。
四、常用方法
1. T get(CameraCharacteristics.Key key)
獲取相機屬性中對應欄位的值。如果輸入的 key 沒有設定,將返回 null。
2. List<CameraCharacteristics.Key<?>> getKeys()
獲取該相機裝置支援的 CameraCharacteristics.Key
的列表。
該方法獲取的 Key 的列表,可以保證用作 CameraCharacteristics 類的 get() 方法時不會返回 null。
返回的 list 是不允許修改的,否則將丟擲 UnsupportedOperationException 異常。
3. List<CaptureRequest.Key<?>> getAvailableCaptureRequestKeys()
獲取該相機裝置支援的 CaptureRequest.Key
的列表。可用於 CaptureRequest 類的 get() 方法。
4. List<CaptureResult.Key<?>> getAvailableCaptureResultKeys()
獲取該相機裝置支援的 CaptureResult.Key
的列表。可用於 CaptureResult 類的 get() 方法。
五、成員欄位
這個太多了,差不多就是翻譯一下官方文件了,這裡一些常用的我就加粗表示吧。
對於一些縮寫,你應該也需要了解,例如 自動曝光 AE(auto exposure)、自動聚焦 AF(auto focus)、自動白平衡 AWB(auto white balance) 等。
型別 | 欄位名 | 描述 |
---|---|---|
public static final Key<int[]> | COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES | 相機裝置支援的像差校正模式列表,用於 android.colorCorrection.aberrationMode |
public static final Key<int[]> | CONTROL_AE_AVAILABLE_ANTIBANDING_MODES | 相機裝置支援的自動曝光反衝帶模式列表,用於 android.control.aeAntibandingMode |
public static final Key<int[]> | CONTROL_AE_AVAILABLE_MODES | 相機裝置支援的自動曝光模式列表,用於 android.control.aeMode |
public static final Key<Range[]<Integer>> | CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES | 相機裝置支援的幀率範圍,用於 android.control.aeTargetFpsRange |
public static final Key<Range<Integer>> | CONTROL_AE_COMPENSATION_RANGE | 相機裝置支援的曝光補償範圍,用於 android.control.aeExposureCompensation |
public static final Key<Rational> | CONTROL_AE_COMPENSATION_STEP | 曝光補償能夠改變的最小步長 |
public static final Key<Boolean> | CONTROL_AE_LOCK_AVAILABLE | 相機裝置是否支援 android.control.aeLock |
public static final Key<int[]> | CONTROL_AF_AVAILABLE_MODES | 相機裝置支援的自動聚焦模式列表,用於 android.control.afMode |
public static final Key<int[]> | CONTROL_AVAILABLE_EFFECTS | 相機裝置支援的顏色效果列表,用於 android.control.effectMode |
public static final Key<int[]> | CONTROL_AVAILABLE_MODES | 相機裝置支援的控制模式列表,用於 android.control.mode |
public static final Key<int[]> | CONTROL_AVAILABLE_SCENE_MODES | 相機裝置支援的場景模式列表(如夜景、美食、燭光等),用於 android.control.sceneMode |
public static final Key<int[]> | CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES | 相機裝置支援的視訊穩定模式列表,用於 android.control.videoStabilizationMode |
public static final Key<int[]> | CONTROL_AWB_AVAILABLE_MODES | 相機裝置支援的自動白平衡模式列表,用於 android.control.awbMode |
public static final Key<Boolean> | CONTROL_AWB_LOCK_AVAILABLE | 相機裝置是否支援 android.control.awbLock |
public static final Key<Integer> | CONTROL_MAX_REGIONS_AE | 自動曝光可使用的最大測量區域數 |
public static final Key<Integer> | CONTROL_MAX_REGIONS_AF | 自動聚焦可使用的最大測量區域數 |
public static final Key<Integer> | CONTROL_MAX_REGIONS_AWB | 自動白平衡可使用的最大測量區域數 |
public static final Key<Range<Integer>> | CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE | 相機裝置支援的 boost 範圍,用於 android.control.postRawSensitivityBoost |
public static final Key<Boolean> | DEPTH_DEPTH_IS_EXCLUSIVE | 指出一個捕捉請求是否能夠同時支援深度輸出(如 DEPTH16 / DEPTH_POINT_CLOUD)和普通顏色輸出(如 YUV_420_888, JPEG 或 RAW) |
public static final Key<int[]> | DISTORTION_CORRECTION_AVAILABLE_MODES | 相機裝置支援的畸變矯正模式列表,用於 android.distortionCorrection.mode |
public static final Key<int[]> | EDGE_AVAILABLE_EDGE_MODES | 相機裝置支援的邊緣增強模式列表,用於 android.edge.mode |
public static final Key<Boolean> | FLASH_INFO_AVAILABLE | 相機裝置是否有閃光燈部件 |
public static final Key<int[]> | HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES | 相機裝置支援的畫素矯正模式列表,用於 android.hotPixel.mode |
public static final Key<Integer> | INFO_SUPPORTED_HARDWARE_LEVEL | 相機裝置支援的硬體等級 |
public static final Key<String> | INFO_VERSION | 關於相機裝置的製造商版本資訊,例如網路服務硬體、感測器等 |
public static final Key<Size[]> | JPEG_AVAILABLE_THUMBNAIL_SIZES | 相機裝置支援的 JPEG 格式縮圖大小列表,用於 android.jpeg.thumbnailSize |
public static final Key<float[]> | LENS_DISTORTION | 矯正係數,以糾正相機裝置的徑向和切向的鏡頭畸變 |
public static final Key<Integer> | LENS_FACING | 相機裝置相對於螢幕的方向,例如後置攝像頭一般是 LENS_FACING_FRONT |
public static final Key<float[]> | LENS_INFO_AVAILABLE_APERTURES | 相機裝置支援的光圈大小列表,用於 android.lens.aperture |
public static final Key<float[]> | LENS_INFO_AVAILABLE_FILTER_DENSITIES | 相機裝置支援的中性密度濾波值列表,用於 android.lens.filterDensity |
public static final Key<float[]> | LENS_INFO_AVAILABLE_FOCAL_LENGTHS | 相機裝置支援的焦距列表,用於 android.lens.focalLength |
public static final Key<int[]> | LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION | 相機裝置支援的光學穩像(optical image stabilization,OIS)模式列表,用於 android.lens.opticalStabilizationMode |
public static final Key<Integer> | LENS_INFO_FOCUS_DISTANCE_CALIBRATION | 鏡頭焦距校準質量 |
public static final Key<Float> | LENS_INFO_HYPERFOCAL_DISTANCE | 鏡頭的超焦距 |
public static final Key<Float> | LENS_INFO_MINIMUM_FOCUS_DISTANCE | 能使鏡頭聚焦的最短距離 |
public static final Key<float[]> | LENS_INTRINSIC_CALIBRATION | 相機裝置的內部標定引數(相機內參) |
public static final Key<Integer> | LENS_POSE_REFERENCE | 鏡頭的引用位置,即用於 android.lens.poseTranslation 的起始座標 |
public static final Key<float[]> | LENS_POSE_ROTATION | 相機裝置相對於感測器座標系的方向 |
public static final Key<float[]> | LENS_POSE_TRANSLATION | 相機光學中心位置 |
public static final Key<float[]> | LENS_RADIAL_DISTORTION | 鏡頭徑向畸變,在 Android 28 上已棄用,使用 android.lens.distortion 代替 |
public static final Key<Integer> | LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE | 物理相機間幀時間戳同步的準確性,決定了物理相機同時開始曝光的能力 |
public static final Key<int[]> | NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES | 相機裝置支援的降噪模式列表,用於 android.noiseReduction.mode |
public static final Key<Integer> | REPROCESS_MAX_CAPTURE_STALL | 重處理捕獲請求時的最大失幀(以幀為單位) |
public static final Key<int[]> | REQUEST_AVAILABLE_CAPABILITIES | 相機裝置完全支援的功能列表 |
public static final Key<Integer> | REQUEST_MAX_NUM_INPUT_STREAMS | 相機裝置能夠同時支援的不同型別的輸入流最大數量 |
public static final Key<Integer> | REQUEST_MAX_NUM_OUTPUT_PROC | 相機裝置能夠同時支援的不同處理格式的輸出流最大數量(無停頓) |
public static final Key<Integer> | REQUEST_MAX_NUM_OUTPUT_PROC_STALLING | 相機裝置能夠同時支援的不同處理格式的輸出流最大數量(有停頓) |
public static final Key<Integer> | REQUEST_MAX_NUM_OUTPUT_RAW | 對於任何 RAW 格式,相機裝置能夠同時支援的不同型別的輸出流最大數量 |
public static final Key<Integer> | REQUEST_PARTIAL_RESULT_COUNT | 定義一個結果將由多少個子結構組成 |
public static final Key<Byte> | REQUEST_PIPELINE_MAX_DEPTH | 指定一個幀從暴露到可使用,所經過的管道階段數的最大值 |
public static final Key<Float> | SCALER_AVAILABLE_MAX_DIGITAL_ZOOM | active 區域寬高和裁剪區域寬度比值的最大值,用於 android.scaler.cropRegion |
public static final Key<Integer> | SCALER_CROPPING_TYPE | 相機裝置支援的裁剪型別,有 CENTER_ONLY 和 FREEFORM ·兩種 |
public static final Key<StreamConfigurationMap> | SCALER_STREAM_CONFIGURATION_MAP | 相機裝置支援的可用流的配置,包括最小幀間隔、不同格式、大小組合的失幀時長 |
public static final Key<int[]> | SENSOR_AVAILABLE_TEST_PATTERN_MODES | 相機裝置支援的測試模式列表,用於 android.sensor.testPatternMode |
public static final Key<BlackLevelPattern> | SENSOR_BLACK_LEVEL_PATTERN | 每個彩色濾光片排列(CFA)鑲嵌通道的固定黑色電平偏移量 |
public static final Key<ColorSpaceTransform> | SENSOR_CALIBRATION_TRANSFORM1 | 從參考感測器顏色空間對映到實際裝置感測器顏色空間的每個裝置校準轉換矩陣 |
public static final Key<ColorSpaceTransform> | SENSOR_CALIBRATION_TRANSFORM2 | 從參考感測器顏色空間對映到實際裝置感測器顏色空間(這是原始緩衝區資料的顏色空間)的每個裝置校準轉換矩陣 |
public static final Key<ColorSpaceTransform> | SENSOR_COLOR_TRANSFORM1 | 將顏色值從CIE XYZ顏色空間轉換為參考感測器顏色空間的矩陣 |
public static final Key<ColorSpaceTransform> | SENSOR_COLOR_TRANSFORM2 | 將顏色值從CIE XYZ顏色空間轉換為參考感測器顏色空間的矩陣 |
public static final Key<ColorSpaceTransform> | SENSOR_FORWARD_MATRIX1 | 一個矩陣,將白平衡攝像機顏色從參考感測器顏色空間轉換為帶有D50白點的CIE XYZ顏色空間 |
public static final Key<ColorSpaceTransform> | SENSOR_FORWARD_MATRIX2 | 一個矩陣,將白平衡攝像機顏色從參考感測器顏色空間轉換為帶有D50白點的CIE XYZ顏色空間 |
public static final Key<Rect> | SENSOR_INFO_ACTIVE_ARRAY_SIZE | 經過幾何畸變校正後,影象感測器對應於活動畫素的面積 |
public static final Key<Integer> | SENSOR_INFO_COLOR_FILTER_ARRANGEMENT | 感測器上顏色濾波器的排列,按讀取順序,表示感測器左上2x2部分的顏色 |
public static final Key<Range<Long>> | SENSOR_INFO_EXPOSURE_TIME_RANGE | 相機裝置支援的圖片曝光時間範圍,用於 android.sensor.exposureTime |
public static final Key<Boolean> | SENSOR_INFO_LENS_SHADING_APPLIED | 相機裝置輸出的原始影象是否受鏡頭陰影校正影響 |
public static final Key<Long> | SENSOR_INFO_MAX_FRAME_DURATION | 相機裝置支援的最大的幀間隔時間,用於 android.sensor.frameDuration |
public static final Key<SizeF> | SENSOR_INFO_PHYSICAL_SIZE | 完整畫素數列的物理尺寸 |
public static final Key<Size> | SENSOR_INFO_PIXEL_ARRAY_SIZE | 完整畫素數列的尺寸,可能包括黑色校準畫素 |
public static final Key<Rect> | SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE | 在應用任何幾何畸變校正之前,與活動畫素相對應的影象感測器的面積 |
public static final Key<Range<Integer>> | SENSOR_INFO_SENSITIVITY_RANGE | 相機裝置支援的敏感度範圍,用於 android.sensor.sensitivity |
public static final Key<Integer> | SENSOR_INFO_TIMESTAMP_SOURCE | 感測器開始捕捉的時間戳的時間基礎 |
public static final Key<Integer> | SENSOR_INFO_WHITE_LEVEL | 感測器最大的 raw 值輸出 |
public static final Key<Integer> | SENSOR_MAX_ANALOG_SENSITIVITY | 純粹通過模擬增益實現的最大敏感度 |
public static final Key<Rect[]> | SENSOR_OPTICAL_BLACK_REGIONS | 表示感測器光學遮蔽的黑色畫素區域的不相交矩形列表 |
public static final Key<Integer> | SENSOR_ORIENTATION | 使輸出影象在裝置螢幕上以本機方向垂直,順時針方向旋轉的角度 |
public static final Key<Integer> | SENSOR_REFERENCE_ILLUMINANT1 | 當計算 android.sensor.colorTransform1, android.sensor.calibrationTransform1 和 android.sensor.forwardMatrix1 矩陣時,作為場景光源的標準參考光源 |
public static final Key<Byte> | SENSOR_REFERENCE_ILLUMINANT2 | 當計算 android.sensor.colorTransform2, android.sensor.calibrationTransform2 和 android.sensor.forwardMatrix2 矩陣時,作為場景光源的標準參考光源 |
public static final Key<int[]> | SHADING_AVAILABLE_MODES | 相機裝置支援的鏡頭應用模式列表,用於 android.shading.mode |
public static final Key<int[]> | STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES | 相機裝置支援的人臉檢測模式列表,用於 android.statistics.faceDetectMode |
public static final Key<boolean[]> | STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES | 相機裝置支援的熱畫素對映輸出模式列表,用於 android.statistics.hotPixelMapMode |
public static final Key<int[]> | STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES | 相機裝置支援的鏡頭陰影對映輸出模式列表,用於 android.statistics.lensShadingMapMode |
public static final Key<int[]> | STATISTICS_INFO_AVAILABLE_OIS_DATA_MODES | 相機裝置支援的 OIS 資料輸出模式列表,用於 android.statistics.lensShadingMapMode |
public static final Key<Integer> | STATISTICS_INFO_MAX_FACE_COUNT | 同時能夠檢測的人臉數的最大值 |
public static final Key<Integer> | SYNC_MAX_LATENCY | 請求(與前一個請求不同)提交後以及結果狀態同步之前可能出現的最大幀數 |
public static final Key<int[]> | TONEMAP_AVAILABLE_TONE_MAP_MODES | 相機裝置支援的影象增強對映模式列表,用於 android.tonemap.mode |
public static final Key<Integer> | TONEMAP_MAX_CURVE_POINTS | 影象增強對映曲線支援的最大點的數量,用於 android.tonemap.curve |