Çıkış akışları, kırpma ve yakınlaştırma

Çıkış akışları

Kamera alt sistemi yalnızca ANativeWindow tabanlı ardışık düzende çalışır tüm çözünürlüklerde ve çıkış biçimlerinde kullanılabilir. Birden fazla akış şurada yapılandırılabilir: GPU, görüntü kalitesi ve video gibi birçok hedefe tek bir kare kodlayıcı RenderScript veya uygulama tarafından görülebilir tamponlar (RAW Bayer, işlenmiş YUV arabellekler veya JPEG kodlu arabellekler).

Optimizasyon olarak bu çıkış akışlarının önceden yapılandırılması gerekir. aynı anda yalnızca sınırlı sayıda olabilir. Bu sayede, görevlerle aranızda kamera donanımının konfigürasyonunu ve arabelleklerini listelenen birden fazla veya değişen çıkış ardışık düzeniyle gönderildiğinden gecikmeleri veya gecikmeleri hesaba katar.

Garantili akış çıkışı kombinasyonları hakkında daha fazla bilgi veya desteklenen donanım düzeyine bağlı olarak, bkz. createCaptureSession()

Kesme

Tam piksel dizisinin kırpılması (dijital yakınlaştırma ve farklı kullanım alanlarının daha küçük bir FOV olması tercih edilir) ANDROID_SCALER_CROP_REGION aracılığıyla iletilir. ayarını değiştirebilirsiniz. Bu ayar istek bazındadır ve istek bazında değişebilir. Bu da yumuşak dijital yakınlaştırma için kritik öneme sahip.

Bölge, (x, y) işaretli bir dikdörtgen (x, y, genişlik, yükseklik) olarak tanımlanır sol üst köşesini gösteren resimler yer alır. Dikdörtgen, (0,0) değeri olacak şekilde sensör aktif piksel dizisinin koordinat sistemi etkin piksel dizisinin sol üst pikseli. Bu nedenle, genişlik ve yükseklik ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY parametresinde bildirilen boyutlardan daha büyük olmalıdır. statik bilgi alanını kullanır. İzin verilen minimum genişlik ve yükseklik HAL tarafından raporlanır aşağıdakileri açıklayan ANDROID_SCALER_MAX_DIGITAL_ZOOM statik bilgi alanı aracılığıyla desteklenen maksimum yakınlaştırma faktörüne Bu nedenle, minimum kırpma bölgesi genişliği ve yükseklik:

  {width, height} =
   { floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[0] /
       ANDROID_SCALER_MAX_DIGITAL_ZOOM),
     floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[1] /
       ANDROID_SCALER_MAX_DIGITAL_ZOOM) }

Kırpma bölgesinin belirli gereksinimleri karşılaması gerekiyorsa (örneğin eşit koordinatlarda başlayacak ve genişliğinin/yüksekliğinin eşit olması gerekir), HAL gerekli yuvarlamayı yapmalıdır. Kırpma bölgesine doğru çıkış sonucu meta verileri. Benzer şekilde, HAL tarafından sonuç kırpma bölgesini, gerçekte dahil edilen bölgeyi görüntü sabitleme uygulandıktan sonra çıktı görünür. Genel olarak kamera kullanan bir uygulamanın aldığı görüntü alanını temel alarak kırpma bölgesi, görüntü sensörünün boyutları ve lensin odak uzaklığı.

Kırpma bölgesi, farklı yönleri farklı olabilecek tüm akışlar için geçerli olduğundan daha büyük bir orandaysa her akış için kullanılan tam sensör bölgesi daha küçük olduğunu görebilirsiniz. Özellikle, her akış kare piksel sayısını ve en boy oranını minimum düzeyde daha fazla kırparak kırpar. bölgesi. Akışın en boy oranı kırpma bölgesinden genişse akış dikey olarak daha da kırpılmalıdır. Ayrıca, akışın en boy oranı kesim bölgesinden daha darsa akışın daha da kırpılması gerekir yerleştireceğiz.

Her durumda, akış kırpması tüm kırpma bölgesi içinde ortalanmalıdır ve her bir akış, tam görüntüye göre yalnızca yatay veya dikey olarak kırpılır. hiçbir zaman kırpmamanız gerekir.

Örneğin, iki akış tanımlanırsa, 640x480 boyutunda bir akış (4:3 en boy) ve bir 1280x720 akış (16:9 en boy), aşağıda beklenen çıkış bölgelerini gösterir birkaç örnek ürün bölgesi için her akış için, varsayımsal 3 MP (2000 x) 1500 piksel dizisi) sensör.

Kırpma bölgesi: (500, 375, 1.000, 750) (4:3 en boy oranı)
640x480 akış kırpma: (500, 375, 1.000, 750) (kırpma bölgesine eşit)
1280x720 akış kırpma: (500, 469, 1000, 562)

kırpma-bölgesi-43-oran

Şekil 1. 4:3 en boy oranı

Kırpma bölgesi: (500, 375, 1333, 750) (16:9 en boy oranı)
640x480 akış kırpma: (666, 375, 1000, 750)
1280x720 akış kırpma: (500, 375, 1333, 750) (kırpma bölgesine eşit)

kırpma-bölgesi-169-oran

Şekil 2. 16:9 en boy oranı

Kırpma bölgesi: (500, 375, 750, 750) (1:1 en boy oranı)
640x480 akış kırpma: (500, 469, 750, 562)
1280x720 akış kırpma: (500, 543, 750, 414)

kırpma-bölgesi-11-oranı

Şekil 3. 1:1 en boy oranı

Son olarak, 480p yerine 1024x1024 kare en boy oranında akış akış:
Kırpma bölgesi: (500, 375, 1.000, 750) (4:3 en boy oranı)
1024x1024 akış kırpma: (625, 375, 750, 750)
1280x720 akış kırpma: (500, 469, 1000, 562)

kırpma-bölgesi-43-kare-oranı

4.Şekil 4:3 en boy oranı, kare

Yeniden işleniyor

RAW Bayer için yeniden işleme desteğiyle ham resim dosyaları için ek destek sağlanır verileri. Bu destek, kamera ardışık düzeninin önceden çekilen bir çekimi RAW arabelleği ve meta veriler (daha önce kaydedilen tüm kare) oluşturulan yeni bir YUV veya JPEG çıkışı üretir.

Yakınlaştırma

Android 11 veya sonraki sürümleri çalıştıran cihazlarda uygulamalar kameranın yakınlaştırma özelliğini kullanabilir (dijital ve optik) ANDROID_CONTROL_ZOOM_RATIO ayarı üzerinden değiştirebilirsiniz.

Yakınlaştırma oranı, kayan nokta faktörü olarak tanımlanır. Şunun yerine: kırpma ve yakınlaştırma için ANDROID_SCALER_CROP_REGION kullanan bir uygulama Yakınlaştırma düzeyini kontrol etmek için ANDROID_CONTROL_ZOOM_RATIO ve Şu boyutta yatay ve dikey kırpma için ANDROID_SCALER_CROP_REGION: orijinal kamera sensöründen farklı en boy oranları elde eder.

Çoklu kamera sisteminde, farklı boyutlarda birden fazla mercek ayarlayabilir ve kullanıcı lensler arasında geçiş yaparak optik yakınlaştırmayı kullanabilir. ANDROID_CONTROL_ZOOM_RATIO kullanmanın aşağıdaki senaryolarda avantajları vardır:

  • Geniş bir lensten telefoto lense yakınlaştırma: Kayan nokta oranı tam sayı değerlerine kıyasla daha iyi kesinlik sağlar. ANDROID_SCALER_CROP_REGION
  • Geniş lensten ultra geniş lense uzaklaştırma: ANDROID_CONTROL_ZOOM_RATIO, uzaklaştırmayı destekliyor (<1.0f); ANDROID_SCALER_CROP_REGION ise bunu yapmaz.

Örnek vermek gerekirse, aşağıda farklı yakınlaştırma oranları, kırpma bölgeleri ve çıktılarla ilgili birkaç senaryo verilmiştir. bir önceki bölümde tanımlanan varsayımsal kamera ile yapılır.

Yakınlaştırma oranı: 2,0; Orijinal görüş alanının 1/4'ü
Kırpma bölgesi: (0, 0, 2000, 1500) (4:3 en boy oranı)
640x480 akış kırpma: (0, 0, 2000, 1500) (kırpma bölgesine eşit)
1280x720 akış kırpma: (0, 187, 2000, 1125)

yakınlaştırma-oranı-2-kırpma-43

5. Şekil. 2,0 yakınlaştırma, 4:3 en boy oranı

Yakınlaştırma oranı: 2,0; Orijinal görüş alanının 1/4'ü
Kırpma bölgesi: (0, 187, 2000, 1125) (16:9 en boy oranı)
640x480 akış kırpma: (250, 187, 1500, 1125) (dikey kutulu)
1280x720 akış kırpma: (0, 187, 2000, 1125) (kırpma bölgesine eşit)

yakınlaştırma-oranı-2-kırpma-169

6. Şekil. 2,0 yakınlaştırma, 16:9 en boy oranı

Yakınlaştırma oranı: 0,5; 4 kat orijinal görüş alanı (geniş lensten ultra geniş lense geçildi)
Kırpma bölgesi: (250, 0, 1500, 1500) (1:1 en boy oranı)
640x480 akış kırpma: (250, 187, 1500, 1125) (sinemaskop)
1280x720 akış kırpma: (250, 328, 1500, 844) (sinemaskop)

resimler/yakınlaştırma-oranı-0,5-kırpma-11

7.Şekil 0,5 yakınlaştırma, 1:1 en boy oranı

Yukarıdaki grafiklerden görüleceği gibi, kırpma bölgesinin koordinat sistemi yakınlaştırma sonrası görünüm alanında gösterilir ve şu boyutlarla dikdörtgenle temsil edilir: (0, 0, activeArrayWith, activeArrayHeight). Aynı durum AE/AWB/AF bölgeleri ve yüzleri için de geçerlidir. Bu koordinat sistemi değişikliği, RAW yakalama ve intrinsicCalibration ve benzeri meta veriler lensShadingMap.

Yukarıdaki varsayıma dayalı aynı örneği kullanarak ve 1. çıkış akışının (640x480) 2,0x yakınlaştırma, iki yöntemden biriyle elde edilebilir:

  • zoomRatio = 2.0, scaler.cropRegion = (0, 0, 2000, 1500)
  • zoomRatio = 1.0 (varsayılan), scaler.cropRegion = (500, 375, 1000, 750)

Bir uygulamanın android.control.aeRegions adresini sol üstte olacak şekilde ayarlamak için vizör görüş alanının dörtte biri ile android.control.aeRegions - (0, 0, 1000, 750) şununla: android.control.zoomRatio, 2.0 olarak ayarlandı. Alternatif olarak: Uygulama, android.control.aeRegions değerini eşdeğer olarak ayarlayabilir şunun için (500, 375, 1000, 750) bölgesi: android.control.zoomRatio/1.0.