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

Çıkış akışları

Kamera alt sistemi, tüm çözünürlükler ve çıktı biçimleri 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 aynı anda birden çok akış yapılandırılabilir.

Bir optimizasyon olarak, bu çıktı akışları önceden yapılandırılmalıdır 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 listelenen birden fazla veya değişken çıkış boru hattı ile gönderildiğinde, isteğin yerine getirilmesinde gecikme veya gecikme olmaz.

Desteklenen donanım düzeyine bağlı olan garantili akış çıkışı kombinasyonları hakkında daha fazla bilgi için bkz. createCaptureSession() .

Kırpma

Tam piksel dizisinin kırpılması (dijital yakınlaştırma ve daha küçük bir FOV'nin 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 sorunsuz dijital yakınlaştırmanın uygulanması için kritik olan istek bazında değişebilir.

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

  {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şlaması ve genişliğinin/yüksekliğinin eşit olması gerekiyorsa), HAL gerekli yuvarlamayı yapmalı ve çıktıda kullanılan son kırpma bölgesini yazmalıdır. sonuç meta verileri. Benzer şekilde, HAL video sabitleme uygularsa, video sabitleme uygulandıktan sonra çıktıya fiilen dahil edilen bölgeyi tanımlamak için sonuç kırpma bölgesini ayarlaması gerekir. Genel olarak, kamera kullanan bir uygulama, kırpma bölgesine, görüntü sensörünün boyutlarına ve lens odak uzaklığına dayalı olarak aldığı görüş alanını belirleyebilmelidir.

Ekin bölgesi, ekin bölgesinden farklı en boy oranlarına sahip olabilen tüm akışlar için geçerli olduğundan, her akış için kullanılan tam algılayıcı bölge, ekin bölgesinden daha küçük olabilir. Spesifik olarak, her akış, tanımlanan kırpma bölgesini minimum düzeyde kırparak kare pikselleri ve en boy oranını korumalıdır. Derenin en boy oranı ekin bölgesinden daha genişse, akarsu dikey olarak daha fazla kırpılmalı ve derenin en boy oranı ekin bölgesinden daha darsa, akarsu yatay olarak daha fazla kırpılmalıdır.

Her durumda, akarsu mahsulü tam mahsul bölgesi içinde ortalanmalıdır ve her akıntı tam mahsul bölgesine göre sadece yatay veya dikey olarak kırpılır, asla ikisi birden olmaz.

Örneğin, 640x480 akış (4:3 en boy oranı) ve 1280x720 akış (16:9 en boy oranı) olmak üzere iki akış tanımlanırsa, aşağıda varsayımsal bir 3 MP (2000 x 1500 piksel dizisi) sensörü.

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)

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ırpma: (666, 375, 1000, 750)
1280x720 akış kırpma: (500, 375, 1333, 750) (kırpma 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ırpma: (500, 469, 750, 562)
1280x720 akış kırpma: (500, 543, 750, 414)

mahsul-bölge-11-oran

Şekil 3. 1:1 en boy oranı

Ve son bir örnek, 480p akış yerine 1024x1024 kare en boy oranlı 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)

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 verileri için yeniden işleme desteğiyle sağlanır. Bu destek, kamera ardışık düzeninin, yeni bir işlenmiş YUV veya JPEG çıktısı üretmek için önceden yakalanmış bir RAW arabelleği ve meta verileri (daha önce kaydedilmiş olan bir çerçevenin tamamı) işlemesine olanak tanır.

yakınlaştır

Android 11 veya sonraki sürümleri çalıştıran cihazlar için bir uygulama, ANDROID_CONTROL_ZOOM_RATIO ayarı aracılığıyla bir 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 için yatay ve dikey kırpma için ANDROID_SCALER_CROP_REGION kullanabilir.

Bir ç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ş bir 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ş lensten ultra geniş lense zoom yapma: ANDROID_CONTROL_ZOOM_RATIO uzaklaştırmayı (<1.0f) desteklerken ANDROID_SCALER_CROP_REGION desteklemez.

Örneklemek için, burada önceki bölümde tanımlanan aynı varsayımsal kamerayı kullanan farklı yakınlaştırma oranları, kırpma bölgeleri ve çıktı akışlarına ilişkin birkaç senaryo verilmiştir.

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-oran-2-kırp-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ırpma: (250, 187, 1500, 1125) (sütun kutulu)
1280x720 akış kırpma: (0, 187, 2000, 1125) (kırpma bölgesine eşit)

yakınlaştırma oranı-2-kırp-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çilmiştir)
Kırpma bölgesi: (250, 0, 1500, 1500) (1:1 en boy oranı)
640x480 akış kırpma: (250, 187, 1500, 1125) (letterboxed)
1280x720 akış kırpma: (250, 328, 1500, 844) (letterboxed)

görüntüler/zoom-oran-0,5-kırp-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 aşağıdaki boyutlara sahip dikdörtgen ile temsil edilir: ( 0 , 0 , activeArrayWith , activeArrayHeight ). Aynısı 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 lensShadingMap gibi ilgili meta verileri 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 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 android.control.aeRegions (0, 0, 1000, 750) olarak ayarlayın ve android.control.zoomRatio 2.0 olarak ayarlayın. Alternatif olarak, uygulama android.control.aeRegions için 1.0 android.control.zoomRatio için (500, 375, 1000, 750) eşdeğer bölgesine ayarlayabilir.