2017-08-04 920 views
1

我很新的Android和嘗試:從相機(的imageformat RAW_SENSOR) 的Android Camera2 RAW流

  • 過程

    • 流的原始數據的原始數據
    • 顯示處理結果交互

    似乎原始數據捕獲僅在靜態捕獲模式下可用。它是否正確 ?

    如果可以,反而對RAW圖像執行重複的CaptureRequests?使用13MP傳感器可以達到什麼樣的性能?任何參考代碼?

    提前許多感謝,

    紀堯姆

    編輯

    這是我迄今所做的:

    • 創建預覽捕捉呈現於表面紋理
    • 計算幀率/

      • 是否確定來計算onSurfaceTextureUpdated幀率():在onSurfaceTextureUpdated()

        問題更新?

      • 我嘗試將不同的尺寸設置爲texture.setDefaultBufferSize(),但它對幀率沒有影響。這是正常的嗎?
    • 原料的ImageReader的表面添加到cameraDevice.createCaptureSession()

    • 添加回調cameraCaptureSessions.setRepeatingRequest()
    • 在回調的onCaptureCompleted()中,加入一captureRawImage()調用每N個幀。
    • captureRawImage()創建靜態圖像捕捉。
    • 將setOnImageAvailableListener()添加到Raw ImageReader中,以對原始圖像執行一些有用的操作。

    的原始分辨率爲4208x3120

    最小幀持續時間爲33ms

    失速持續時間爲200ms

    我得到的僅用於預覽的幀率爲25-30幀。

    當我預覽和啓用原始捕捉每幀的幀速率約爲15 fps。

    我得到了一些「ImageReader_JNI:無法獲取緩衝區項目,很可能客戶端試圖獲取超過maxImages緩衝區」消息,即使我每100幀執行一次原始捕獲。這是否是做我想做一個適當的方式

    • 我很想得到一些反饋。

    • 如果能夠更高效地轉換爲突發採集而不是靜止圖像,那我該如何切換到突發採集。
    • 這些初始數字是否有意義。

    非常感謝,

    紀堯姆

  • 回答

    2

    無論RAW拍攝是在所有支持的,什麼速度是可以做到的都依賴於設備。

    如果設備支持RAW capability,則可以使用RAW_SENSOR格式的ImageReader作爲捕獲目標。該格式也將在available output formats中列出。您可以在RAW能力表中查看createCaptureSession文檔中支持的流類型組合。

    要確定您可以捕獲RAW緩衝區的速度,請查看getOutputMinFrameDuration的輸出,它可以告訴您在包含給定格式和分辨率組合的輸出時,最大幀速率。此外,getOutputStallDuration方法會告訴您,您是否需要在兩個連續請求之間額外延遲以定位RAW輸出以避免拖延預覽。在一般情況下,不需要支持RAW緩衝區的任何特定輸出速率。但是,如果設備支持效率更高的RAW10或RAW12格式,並且支持BURST_CAPTURE功能,則可以保證以至少20fps的速率捕獲這些格式。

    您可以查看Google camera2raw樣本以瞭解基本靜態捕獲。但是,您可以連續捕獲RAW緩衝區,而不是JPEG緩衝區。但是在這種情況下,幀速率可能非常低,爲了保留預覽幀速率,您可能希望僅在每N個預覽幀中發出一個RAW捕捉。例如,如果RAW_SENSOR的停頓持續時間爲100ms,但最小幀持續時間爲30ms,則可以通過捕獲請求模式爲(R + P),P,P,P(R + P),P,P,P ...,以便在每個原始捕獲的起始點之間至少有100 ms。這會讓你〜8fps RAW和30fps預覽。

    +0

    謝謝艾迪,這是非常有用的信息! – Guillaume