Çı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ı ardışık düzende ç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 tek seferde birden çok akış 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 akış bulunabilir. Bu sayede, isteklerin birden fazla veya değişen çıkış ardışık düzenleriyle birlikte gönderildiğinde isteklerin yerine getirilmesinde gecikme veya gecikmeli yanıt yaşanmaması için bellek arabelleklerinin önceden ayrılmasına ve kamera donanımının yapılandırılmasına olanak tanınmaktadır.

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

Kesme

Tam piksel dizisinin kırpılması (dijital yakınlaştırma ve daha küçük bir FOV'nin istenen 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şebilir. Bu, sorunsuz dijital yakınlaştırma için kritik öneme sahiptir.

Bölge, (x, y, width, height) şeklinde bir dikdörtgen olarak tanımlanır. Bu dikdörtgenin sol üst köşesi (x, y) ile açıklanır. Dikdörtgen, sensör etkin piksel dizisinin koordinat sisteminde tanımlanır. Bu sistemde (0,0), etkin piksel dizisinin sol üst pikseli olur. Bu nedenle, genişlik ve yükseklik, ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY statik bilgi alanında raporlanan boyutlardan daha büyük olamaz. İzin verilen minimum genişlik ve yükseklik, HAL tarafından ANDROID_SCALER_MAX_DIGITAL_ZOOM statik bilgi alanı aracılığıyla bildirilir. Bu alan, desteklenen maksimum yakınlaştırma faktörünü tanımlar. Bu nedenle, minimum kırpma bölgesi genişliği ve yüksekliği şu şekildedir:

  {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 (ör. çift koordinatlarda başlaması ve genişliğinin/yüksekliğinin çift olması gerekir) HAL gerekli yuvarlamayı yapmalı ve çıkış sonucu meta verilerinde kullanılan nihai kırpma bölgesini yazmalıdır. Benzer şekilde, HAL video sabitleme uygularsa sonuç kırpma bölgesini, video sabitleme uygulandıktan sonra çıktıya dahil edilen bölgeyi tanımlayacak şekilde ayarlamalıdır. Genel olarak, kamera kullanan bir uygulama, kırpma bölgesine, görüntü sensörünün boyutlarına ve lens odak uzunluğuna göre aldığı görüş alanını belirleyebilmelidir.

Kırpma bölgesi, kırpma bölgesinden farklı en boy oranlarına sahip olabilecek tüm yayınlar için geçerli olduğundan, her yayın için kullanılan tam sensör bölgesi kırpma bölgesinden daha küçük olabilir. Daha açık belirtmek gerekirse her yayın, tanımlanan kırpma bölgesini minimum düzeyde daha da kırparak kare pikselleri ve en boy oranını korumalıdır. Yayın en boy oranı kırpma bölgesinden daha genişse yayın daha da dikey olarak kırpılmalıdır. Yayın en boy oranı kırpma bölgesinden daha darsa yayın daha da yatay olarak kırpılmalıdır.

Her durumda, yayın kırpması tam kırpma bölgesinin ortasına yerleştirilmelidir ve her yayın, tam kırpma bölgesine göre yalnızca yatay veya dikey olarak kırpılır, hiçbir zaman ikisi birden kırpılmaz.

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

Kırpma bölgesi: (500, 375, 1000, 750) (4:3 en boy oranı)
640x480 yayın kırpması: (500, 375, 1000, 750) (kırpma bölgesine eşit)
1280x720 yayın kırpması: (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 yayın kırpması: (666, 375, 1000, 750)
1280x720 yayın kırpması: (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 yayın kırpması: (500, 469, 750, 562)
1280x720 yayın kırpması: (500, 543, 750, 414)

crop-region-11-ratio

Şekil 3. 1:1 en boy oranı

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

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

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

Yeniden işleniyor

RAW Bayer verileri için yeniden işleme desteği, ham görüntü dosyaları için ek destek sağlar. Bu destek, kamera ardışık düzeninin yeni oluşturulmuş bir YUV veya JPEG çıkışı oluşturmak için önceden yakalanmış RAW arabelleğini ve meta verilerini (daha önce kaydedilen tüm kare) işleyebilmesini sağlar.

Yakınlaştırma

Android 11 veya sonraki sürümleri çalıştıran cihazlarda uygulamalar, ANDROID_CONTROL_ZOOM_RATIO ayarını kullanarak kameranın yakınlaştırma özelliğini (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 yerine yakınlaştırma düzeyini kontrol etmek için ANDROID_CONTROL_ZOOM_RATIO'ü, doğal 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ı sistemler, farklı odak uzunluklarına sahip birden fazla lens içerebilir. 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ı, ANDROID_SCALER_CROP_REGION tam sayı değerlerine kıyasla daha iyi hassasiyet sağlar.
  • Geniş lensten ultra geniş lense yakınlaştırma: ANDROID_CONTROL_ZOOM_RATIO, uzaklaştırmayı (<1,0f) destekler, ANDROID_SCALER_CROP_REGION ise desteklemez.

Örnek vermek gerekirse, bir önceki bölümde tanımlanan varsayımsal kamera kullanılarak farklı yakınlaştırma oranları, kırpma bölgeleri ve çıkış akışları için çeşitli senaryolar aşağıda 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 yayın kırpması: (0, 0, 2000, 1500) (kırpma bölgesine eşit)
1280x720 yayın kırpması: (0, 187, 2000, 1125)

zoom-ratio-2-crop-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'ü (1/4) (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) (pillarbox2080, dikey kırpılmış bölge)
Kırpma bölgesi10, 187, 2000, 1125

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; orijinal görüş alanının 4x'i (geniş lensten ultra geniş lense geçildi)
24x1000, 1125) Kırpma bölgesi: (250, 0, 1500, 1500) (1:1 en boy oranı)
640x480 akış kırpma: (250, 187, 1500, harfli kutu24, 1125)

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 grafiklerde görüldüğü gibi, kırpma bölgesinin koordinat sistemi, yakınlaştırma sonrası etkili görüş alanına dönüşür ve aşağıdaki boyutlara sahip dikdörtgenle temsil edilir: (0, 0, activeArrayWith, activeArrayHeight). Aynı durum AE/AWB/AF bölgeleri ve yüzler için de geçerlidir. Bu koordinat sistemi değişikliği, RAW çekimi ve intrinsicCalibration ile lensShadingMap gibi ilgili meta veriler için geçerli değildir.

Yukarıdaki varsayıma dayalı aynı örneği kullanarak ve 1.çıkış akışının (640x480) vizör akışı olduğu varsayıldığında, 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 değerini vizör görüş alanının sol üst çeyreği olarak ayarlaması için android.control.aeRegions değerini (0, 0, 1000, 750), android.control.zoomRatio değerini ise 2.0 olarak ayarlayın. Alternatif olarak uygulama, 1.0'daki android.control.zoomRatio için android.control.aeRegions(500, 375, 1000, 750)'un eşdeğer bölgesine ayarlayabilir.