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

Çıkış akışları

Kamera alt sistemi, tüm çözünürlükler ve çıktı formatları için yalnızca ANativeWindow tabanlı işlem hattında çalışır. GPU, video kodlayıcı, RenderScript veya uygulama tarafından görülebilen arabellekler (RAW Bayer, işlenmiş YUV arabellekleri veya JPEG kodlu arabellekler) gibi birçok hedefe tek bir kare göndermek için birden fazla akış aynı anda yapılandırılabilir.

Bir optimizasyon olarak bu çıkış akışlarının önceden yapılandırılması gerekir ve aynı anda yalnızca sınırlı sayıda mevcut olabilir. Bu, bellek arabelleklerinin önceden tahsis edilmesine ve kamera donanımının yapılandırılmasına olanak tanır; böylece istekler birden fazla veya değişken çıkış hatları listelenerek gönderildiğinde, isteğin yerine getirilmesinde gecikme veya gecikme yaşanmaz.

Desteklenen donanım düzeyine bağlı olarak garanti edilen akış çıkışı birleşimleri hakkında daha fazla bilgi için createCaptureSession() öğesine bakın.

Kırpma

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

Bölge bir dikdörtgen (x, y, genişlik, yükseklik) olarak tanımlanır ve (x, y) dikdörtgenin sol üst köşesini tanımlar. Dikdörtgen, sensör aktif piksel dizisinin koordinat sistemi üzerinde 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 raporlanır. Bu nedenle minimum ürün bölgesi genişliği ve yüksekliği şöyledir:

  {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) }

Mahsul bölgesinin belirli gereksinimleri karşılaması gerekiyorsa (örneğin, eşit koordinatlarda başlaması ve genişliği/yüksekliği eşit olması gerekiyorsa), HAL'nin gerekli yuvarlamayı yapması ve çıktıda kullanılan son mahsul bölgesini yazması gerekir. sonuç meta verileri. Benzer şekilde, HAL video sabitlemeyi uyguluyorsa, sonuç kırpma bölgesini, video sabitleme uygulandıktan sonra çıktıya gerçekten dahil edilen bölgeyi tanımlayacak şekilde ayarlaması gerekir. Genel olarak kamera kullanan bir uygulamanın, kırpma bölgesine, görüntü sensörünün boyutlarına ve lens odak uzaklığına bağlı olarak aldığı görüş alanını belirleyebilmesi gerekir.

Mahsul bölgesi, mahsül bölgesinden farklı en-boy oranlarına sahip olabilen tüm akarsular için geçerli olduğundan, her akıntı için kullanılan tam sensör bölgesi, mahsul bölgesinden daha küçük olabilir. Spesifik olarak, her akış, tanımlanan kırpma bölgesini minimum düzeyde daha fazla kırparak kare pikselleri ve en boy oranını korumalıdır. Akarsuyun en-boy oranı mahsul bölgesinden daha genişse, akarsuyun dikey olarak daha fazla kırpılması gerekir ve eğer nehrin en-boy oranı mahsul bölgesinden daha darsa, akarsuyun yatay olarak daha fazla kırpılması gerekir.

Her durumda, akarsu mahsulünün tam mahsul bölgesi içinde ortalanması gerekir ve her akarsu, tam mahsul bölgesine göre yalnızca yatay veya dikey olarak kırpılır, asla her ikisinde birden kırpılmaz.

Örneğin, 640x480'lik bir akış (4:3 en boy oranı) ve bir 1280x720'lik akış (16:9 en boy oranı) olmak üzere iki akış tanımlanmışsa, aşağıda varsayımsal bir 3'te birkaç örnek mahsul bölgesi için her akış için beklenen çıktı bölgeleri gösterilmektedir. MP (2000 x 1500 piksel dizisi) sensörü.

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

mahsul-bölge-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ırpması: (666, 375, 1000, 750)
1280x720 akış kırpması: (500, 375, 1333, 750) (ekin bölgesine eşit)

mahsul-bölge-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ırpması: (500, 469, 750, 562)
1280x720 akış kırpması: (500, 543, 750, 414)

mahsul bölgesi-11 oranı

Şekil 3. 1:1 en boy oranı

Ve son bir örnek, 480p akış yerine 1024x1024 kare en boy oranlı bir akış:
Kırpma bölgesi: (500, 375, 1000, 750) (4:3 en boy oranı)
1024x1024 akış kırpması: (625, 375, 750, 750)
1280x720 akış kırpması: (500, 469, 1000, 562)

mahsul-bölge-43-kare-oran

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

Yeniden işleme

Ham görüntü dosyaları için ek destek, RAW Bayer verilerinin yeniden işlenmesi desteğiyle sağlanır. Bu destek, kamera hattının önceden yakalanmış bir RAW arabelleğini ve meta verileri (önceden kaydedilmiş bir karenin tamamı) işlemesine ve yeni işlenmiş bir YUV veya JPEG çıkışı üretmesine olanak tanır.

Yakınlaştır

Android 11 veya sonraki sürümleri çalıştıran cihazlarda bir uygulama, ANDROID_CONTROL_ZOOM_RATIO ayarı aracılığıyla kameranın yakınlaştırmasını (dijital ve optik) 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 kullanabilir ve yerel kamera sensöründen farklı en boy oranları elde etmek amacıyla yatay ve dikey kırpma için ANDROID_SCALER_CROP_REGION kullanabilir.

Çoklu kamera sistemi, farklı odak uzunluklarına sahip birden fazla lens içerebilir 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 faydaları vardır:

  • Geniş mercekten telefoto merceğe yakınlaştırma: Kayan nokta oranı, ANDROID_SCALER_CROP_REGION tamsayı değerlerine kıyasla daha iyi hassasiyet sağlar.
  • Geniş bir mercekten ultra geniş bir merceğe uzaklaştırma: ANDROID_CONTROL_ZOOM_RATIO uzaklaştırmayı (<1,0f) desteklerken ANDROID_SCALER_CROP_REGION desteklemez.

Örnek olarak, önceki bölümde tanımlanan aynı varsayımsal kameranın kullanıldığı, farklı yakınlaştırma oranları, kırpma bölgeleri ve çıktı akışlarından oluşan çeşitli senaryoları burada 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ırpması: (0, 0, 2000, 1500) (ekin bölgesine eşit)
1280x720 akış kırpması: (0, 187, 2000, 1125)

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

Şekil 5. 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ırpması: (250, 187, 1500, 1125) (sütun kutulu)
1280x720 akış kırpması: (0, 187, 2000, 1125) (ekin bölgesine eşit)

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

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

Yakınlaştırma oranı: 0,5; 4x 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ırpması: (250, 187, 1500, 1125) (mektup kutusuyla)
1280x720 akış kırpması: (250, 328, 1500, 844) (mektup kutusuyla)

görüntüler/yakınlaştırma oranı-0,5-kırpma-11

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

Yukarıdaki grafiklerden görüldüğü gibi, kırpma bölgesinin koordinat sistemi etkili yakınlaştırma sonrası görüş alanına dönüşür ve şu boyutlara sahip 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 bununla ilgili intrinsicCalibration ve lensShadingMap gibi meta veriler için geçerli değildir.

Yukarıdaki aynı varsayımsal örnek kullanılarak ve çıkış akışı #1'in (640x480) vizör akışı olduğu varsayılarak 2,0x yakınlaştırma iki yoldan 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 vizör görüş alanının sol üst çeyreği olarak ayarlaması için android.control.aeRegions (0, 0, 1000, 750) olarak ayarlayın ve android.control.zoomRatio değerini 2.0 olarak ayarlayın. Alternatif olarak uygulama, android.control.aeRegions android.control.zoomRatio için (500, 375, 1000, 750) eşdeğer bölgesine 1.0 olarak ayarlayabilir.