Android開發 Camera2的CaptureRequest屬性整理--完善中


前言

  如果你想深入了解如何控制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在某些設備上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM