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

Çıkış akışları

Kamera alt sistemi, tüm çözünürlükler ve çıkış biçimleri için yalnızca ANativeWindow tabanlı işlem hattında çalışır. Tek bir kareyi GPU, video kodlayıcı, RenderScript veya uygulamada görünen arabellekler (RAW Bayer, işlenmiş YUV arabellekleri veya JPEG kodlu arabellekler) gibi birçok hedefe göndermek için birden fazla akış aynı anda yapılandırılabilir.

Optimizasyon amacıyla bu çıkış akışları önceden yapılandırılmalıdır ve aynı anda yalnızca sınırlı sayıda çıkış akışı olabilir. Bu sayede, bellek arabelleklerinin önceden ayrılması ve kamera donanımının yapılandırılması mümkün olur. Böylece, birden fazla veya farklı çıkış işlem hattı listelenerek istekler gönderildiğinde isteğin karşılanmasında gecikme veya bekleme olmaz.

Desteklenen donanım düzeyine bağlı olarak garanti edilen yayın çıkışı kombinasyonları hakkında daha fazla bilgi için createCaptureSession() başlıklı makaleyi inceleyin.

Kesme

Tam piksel dizisinin kırpılması (dijital yakınlaştırma ve daha küçük bir FOV'un istendiği diğer kullanım alanları için) ANDROID_SCALER_CROP_REGION ayarı aracılığıyla iletilir. Bu, istek başına bir ayardır ve istek başına değiştirilebilir. Bu durum, sorunsuz dijital zoom uygulaması için kritik öneme sahiptir.

Bölge, dikdörtgen (x, y, genişlik, yükseklik) olarak tanımlanır. (x, y) dikdörtgenin sol üst köşesini belirtir. Dikdörtgen, sensörün etkin piksel dizisinin koordinat sisteminde tanımlanır. (0,0), etkin piksel dizisinin sol üst pikselidir. Bu nedenle, genişlik ve yükseklik, ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY statik bilgi alanında bildirilen boyutlardan daha büyük olamaz. İzin verilen minimum genişlik ve yükseklik, desteklenen maksimum yakınlaştırma faktörünü açıklayan ANDROID_SCALER_MAX_DIGITAL_ZOOM statik bilgi alanı aracılığıyla HAL tarafından bildirilir. Bu nedenle, minimum kırpma bölgesi genişliği ve yüksekliği şunlardır:

  {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 koşulları karşılaması gerekiyorsa (örneğin, çift koordinatlarda başlaması ve genişliğinin/yüksekliğinin çift olması gerekiyorsa) HAL gerekli yuvarlamayı yapmalı ve çıkış sonucu meta verilerinde kullanılan son kırpma bölgesini yazmalıdır. Benzer şekilde, HAL video sabitleme uyguluyorsa video sabitleme uygulandıktan sonra çıkışa dahil edilen bölgeyi tanımlamak için sonuç kırpma bölgesini ayarlaması gerekir. Genel olarak, kamera kullanan bir uygulamanın kırpma bölgesine, görüntü sensörünün boyutlarına ve lensin odak uzaklığına göre aldığı görüş alanını belirleyebilmesi gerekir.

Kırpma bölgesi, kırpma bölgesinden farklı en boy oranlarına sahip olabilecek tüm akışlar için geçerli olduğundan, her akış için kullanılan tam sensör bölgesi, kırpma bölgesinden daha küçük olabilir. Daha net bir ifadeyle, her akış, tanımlanan kırpma bölgesini en az şekilde daha fazla kırparak kare pikselleri ve en boy oranını korumalıdır. Akışın en boy oranı kırpma bölgesinden daha genişse akış dikey olarak daha fazla kırpılmalı, akışın en boy oranı kırpma bölgesinden daha dar ise akış yatay olarak daha fazla kırpılmalıdır.

Her durumda, akış kırpma işlemi tam kırpma bölgesi içinde ortalanmalıdır ve her akış, tam kırpma bölgesine göre yalnızca yatay veya dikey olarak kırpılır, asla ikisi birden kırpılmaz.

Örneğin, iki akış tanımlanmışsa (640x480 akış (4:3 en-boy oranı) ve 1280x720 akış (16:9 en-boy oranı)), aşağıda 3 MP (2000 x 1500 piksel dizisi) sensörde birkaç örnek kırpma bölgesi için her akışın beklenen çıkış bölgeleri gösterilmektedir.

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

crop-region-43-ratio

1. şekil. 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ölgesiyle aynı)

crop-region-169-ratio

Ş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)

crop-region-11-ratio

3.Şekil 1:1 en boy oranı

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

crop-region-43-square-ratio

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

Yeniden işleme

RAW Bayer verileri için yeniden işleme desteği sayesinde, RAW görüntü dosyaları için ek destek sağlanır. Bu destek, kamera işlem hattının daha önce yakalanmış bir RAW arabelleğini ve meta verileri (daha önce kaydedilmiş bir çerçevenin tamamı) işlemesine olanak tanıyarak yeni bir oluşturulmuş YUV veya JPEG çıkışı üretmesini sağlar.

Yakınlaştır

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

Yakınlaştırma oranı, kayan nokta faktörü olarak tanımlanır. Bir uygulama, kırpma ve yakınlaştırma için ANDROID_SCALER_CROP_REGION kullanmak yerine yakınlaştırma düzeyini kontrol etmek için ANDROID_CONTROL_ZOOM_RATIO, yerel kamera sensöründen farklı en boy oranları elde etmek için yatay ve dikey kırpma için ANDROID_SCALER_CROP_REGION kullanabilir.

Çok kameralı bir sistem, farklı odak uzaklıklarına sahip birden fazla lens içerebilir ve kullanıcı, lensler arasında geçiş yaparak optik zoom kullanabilir. ANDROID_CONTROL_ZOOM_RATIO'yı kullanmak aşağıdaki senaryolarda avantaj sağlar:

  • Geniş açılı lensten telefoto lense yakınlaştırma: Kayan nokta oranı, ANDROID_SCALER_CROP_REGION tam sayı değerlerine kıyasla daha iyi hassasiyet sağlar.
  • Geniş lensten ultra geniş lense uzaklaştırma: ANDROID_CONTROL_ZOOM_RATIO uzaklaştırmayı destekler (<1.0f) ancak ANDROID_SCALER_CROP_REGION desteklemez.

Örnek olarak, önceki bölümde tanımlanan aynı varsayımsal kamera kullanılarak farklı yakınlaştırma oranları, kırpma bölgeleri ve çıkış akışlarının yer aldığı çeşitli senaryoları aşağıda bulabilirsiniz.

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)

zoom-ratio-2-crop-43

5.şekil 2,0x 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) (pillarbox)
1280x720 akış kırpma: (0, 187, 2000, 1125) (kırpma bölgesiyle aynı)

zoom-ratio-2-crop-169

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

Yakınlaştırma oranı: 0,5; orijinal görüş alanının 4 katı (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) (letterbox)
1280x720 akış kırpma: (250, 328, 1500, 844) (letterbox)

images/zoom-ratio-0.5-crop-11

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

Yukarıdaki grafiklerden de görüleceği gibi, kırpma bölgesinin koordinat sistemi, yakınlaştırma sonrası etkin görüş alanına dönüşür ve şu boyutlara sahip dikdörtgenle gösterilir: (0, 0, activeArrayWith, activeArrayHeight). AE/AWB/AF bölgeleri ve yüzler için de aynı durum geçerlidir. Bu koordinat sistemi değişikliği, RAW çekim ve intrinsicCalibration ile lensShadingMap gibi ilgili meta veriler için geçerli değildir.

Yukarıdaki aynı varsayımsal örneği kullanarak ve 1 numaralı çıkış akışının (640x480) vizör akışı olduğunu varsayarak 2,0x yakınlaştırma iki şekilde 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 değerini vizörün görüş alanının sol üst çeyreği olarak ayarlaması için android.control.aeRegions değerini (0, 0, 1000, 750) olarak, android.control.zoomRatio değerini ise 2.0 olarak ayarlayın. Alternatif olarak, uygulama android.control.aeRegions değerini 1.0 için (500, 375, 1000, 750) bölgesinin android.control.zoomRatio eşdeğeri olarak ayarlayabilir.