Görüntü analizi

Görüntü analizi kullanım alanı, uygulamanızın üzerinde daha fazla bilgi edinebileceğiniz görüntü işleme, bilgisayar görüşü veya makine öğrenimi çıkarımı gerçekleştirme. İlgili içeriği oluşturmak için kullanılan bir analyze() yöntemini çağırın.

Google'ın Makine Öğrenimi Kiti'ni CameraX uygulamanızla nasıl entegre edeceğinizi öğrenmek için ML Kit Analiz Aracı'na göz atın.

Çalışma Modları

Uygulamanın analiz ardışık düzeni CameraX'in çerçevesine yetişemediğinde hız gereksinimleri olmadan, CameraX aşağıdaki yöntemlerden biriyle kareleri bırakacak şekilde yapılandırılabilir:

  • engellenmeyen (varsayılan): Bu modda, yürütücü her zaman en son resmi resim arabelleğine (bir derinliği olan sıraya benzer) uygulama önceki resmi analiz eder. CameraX ise uygulamanın işlenmesi bitmeden yeni bir resim alırsa yeni resim, önceki resmin üzerine yazılarak aynı arabelleğe kaydedilir. ImageAnalysis.Builder.setImageQueueDepth() yönteminin şu işlemlerde etkili olmadığını unutmayın: her zaman arabellek içeriğinin üzerine yazılır. Şu numarayı arayarak bu engelleme modunu etkinleştirebilirsiniz: setBackpressureStrategy() STRATEGY_KEEP_ONLY_LATEST Yürütücü etkileri hakkında daha fazla bilgi için şuraya bakın: belgeleri STRATEGY_KEEP_ONLY_LATEST.

  • engelleme: Bu modda, dahili yürütücü birden çok resim ekleyebilir dahili görüntü sırasına geri yüklenir ve yalnızca sıra, dolu. Engelleme, kamera cihazının kapsamının tamamında gerçekleşir: çok sayıda sınırlı kullanım alanı olduğundan bu kullanım alanlarının tümü kameraX bu resimleri işlerken engellenir. Örneğin, Örneğin, hem önizleme hem de resim analizi bir Kamera cihazına bağlı olduğunda, KameraX resimleri işlerken önizleme de engellenir. Engelleme modunu etkinleştirmek için STRATEGY_BLOCK_PRODUCER - setBackpressureStrategy(). Görüntü sırası derinliğini aşağıdakileri kullanarak da yapılandırabilirsiniz: ImageAnalysis.Builder.setImageQueueDepth() değerine ayarlayın.

Düşük gecikmeli ve yüksek performans analizcili olduğu için test etmek istediğiniz bir resmi analiz etme süresi bir CameraX karesinin süresinden kısaysa (örneğin 60 fps için 16 ms) iki çalışma modu da sahip olacaksınız. Engelleme modu, şu gibi bazı senaryolarda yararlı olabilir: çok kısa sistem ses dalgalanmalarıyla çalışırken.

Yüksek gecikmeli ve yüksek performans gösteren analiz edici sayesinde, yüksek gecikmeli gecikmeyi telafi etmek için daha uzun bir sıra gereklidir. Ancak, uygulaması tüm kareleri işleyebilir.

Yüksek gecikme ve zaman alan analiz aracı (analizör tüm olduğu gibi), engellemeyen bir mod daha uygun bir seçenek olabilir, çünkü analiz yolu için karelerin bırakılması gerekir ancak diğer eşzamanlı bağlı kullanım alanları tüm kareleri görmeye devam edebilir.

Uygulama

Uygulamanızda resim analizini kullanmak için şu adımları izleyin:

KameraX, bağlamadan hemen sonra görüntüleri kayıtlı analizcinize gönderir. Analizi tamamladıktan sonra ImageAnalysis.clearAnalyzer() veya analizi durdurmak için ImageAnalysis kullanım alanının bağlantısını kaldırın.

ImageAnalysis kullanım alanı derleme

ImageAnalysis bağlanıyor analizcinizi (görüntü tüketicisi) görüntü üreticisi olan CameraX'e bağlayabilirsiniz. Uygulamalar, ImageAnalysis.Builder ImageAnalysis nesnesi oluşturun. ImageAnalysis.Builder ile, uygulamanız aşağıdakileri yapılandırabilir:

Uygulamalar çözünürlüğü veya en boy oranını ayarlayabilir, ancak ayarlayamaz her ikisini de seçebilirsiniz. Tam çıkış çözünürlüğü, uygulamanın istenen boyutuna bağlıdır (veya en boy oranı) ve donanım özellikleri gibidir ve istenenden farklı olabilir. veya oran. Çözünürlük eşleştirme algoritması hakkında bilgi için belgeleri, setTargetResolution()

Uygulama, çıkış resim piksellerini YUV (varsayılan) olacak şekilde yapılandırabilir. veya RGBA renk alanları. Bir RGBA çıkış biçimi ayarlanırken CameraX'in dahili resimleri YUV'den RGBA renk alanına dönüştürür ve resim bitlerini ByteBuffer ilk düzleminin (diğer iki düzlem kullanılmaz) sıra şu şekildedir:

ImageProxy.getPlanes()[0].buffer[0]: alpha
ImageProxy.getPlanes()[0].buffer[1]: red
ImageProxy.getPlanes()[0].buffer[2]: green
ImageProxy.getPlanes()[0].buffer[3]: blue
...

Cihazın tespit edemediği karmaşık görüntü analizi yaparken sonra, CameraX'ı, arka plandaki kareleri azaltacak şekilde bu konunun İşletim Modları bölümünde açıklanan stratejiler.

Analiz aracınızı oluşturma

Uygulamalar, ImageAnalysis.Analyzer arayüz ve geçersiz kılma analyze(ImageProxy image). Her analizcide, uygulamalar bir Sarmalayıcı olan ImageProxy Media.Image için kullanılır. Resim biçimi ImageProxy.getFormat(). Biçim, uygulamanın ImageAnalysis.Builder sağlar:

  • Uygulama OUTPUT_IMAGE_FORMAT_RGBA_8888 istediyse ImageFormat.RGBA_8888.
  • Uygulama OUTPUT_IMAGE_FORMAT_YUV_420_888 istediyse ImageFormat.YUV_420_888.

Build ImageAnalysis kullanım alanına göz atın değerini girin.

Analiz aracı içinde uygulama şunları yapmalıdır:

  1. Belirli bir kareyi mümkün olduğunca hızlı bir şekilde, tercihen belirtilen kare hızı zaman sınırı (örneğin, 30 fps'lik durumda 32 ms'den az). Uygulama bir çerçeveyi yeterince hızlı bir şekilde analiz edemezse birini desteklenen çerçeve bırakma mekanizmalarını kullanın.
  2. Şu numarayı arayarak ImageProxy cihazını CameraX'e bırakın ImageProxy.close() Sarmalanmış Media.Image'ın kapatma işlevini çağırmamanız gerektiğini unutmayın (Media.Image.close()).

Uygulamalar doğrudan ImageProxy'nin içindeki sarmalanmış Media.Image öğesini kullanabilir. Bozulacağı için, sarmalanmış resimde Media.Image.close() yöntemini çağırmayın CameraX içindeki resim paylaşım mekanizması; bunun yerine ImageProxy.close() temel Media.Image öğesini CameraX'e yayınlamak için kullanılır.

Analiz aracınızı ImageAnalysis için yapılandırma

Analiz aracı oluşturduktan sonra, ImageAnalysis.setAnalyzer() kaydedin. Analizle işiniz bittiğinde, ImageAnalysis.clearAnalyzer() kayıtlı analiz aracını kaldırın.

Görüntü analizi için yalnızca bir etkin analiz edici yapılandırılabilir. Telefon etme ImageAnalysis.setAnalyzer(), zaten kayıtlı analiz edicinin yerini alır gerekir. Uygulamalar bağlama işleminden önce veya sonra herhangi bir zamanda yeni bir analizci ayarlayabilir öğrenebilirsiniz.

ImageAnalysis'i bir yaşam döngüsüne bağlama

ImageAnalysis öğenizi mevcut bir AndroidX yaşam döngüsünü ProcessCameraProvider.bindToLifecycle() işlevini kullanın. bindToLifecycle() işlevinin seçilen değeri döndürdüğünü unutmayın. Camera cihaz, kullanılabilir pozlama ve diğer gelişmiş ayarlarda hassas düzenlemeler yapabilirsiniz. Kamera çıkışını kontrol etme hakkında daha fazla bilgi için bu kılavuza bakın.

Aşağıdaki örnekte önceki adımlardaki tüm adımlar hem bağlama hem de Bir lifeCycle sahibi için CameraX ImageAnalysis ve Preview kullanım alanları:

Kotlin

val imageAnalysis = ImageAnalysis.Builder()
    // enable the following line if RGBA output is needed.
    // .setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_RGBA_8888)
    .setTargetResolution(Size(1280, 720))
    .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
    .build()
imageAnalysis.setAnalyzer(executor, ImageAnalysis.Analyzer { imageProxy ->
    val rotationDegrees = imageProxy.imageInfo.rotationDegrees
    // insert your code here.
    ...
    // after done, release the ImageProxy object
    imageProxy.close()
})

cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, imageAnalysis, preview)

Java

ImageAnalysis imageAnalysis =
    new ImageAnalysis.Builder()
        // enable the following line if RGBA output is needed.
        //.setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_RGBA_8888)
        .setTargetResolution(new Size(1280, 720))
        .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
        .build();

imageAnalysis.setAnalyzer(executor, new ImageAnalysis.Analyzer() {
    @Override
    public void analyze(@NonNull ImageProxy imageProxy) {
        int rotationDegrees = imageProxy.getImageInfo().getRotationDegrees();
            // insert your code here.
            ...
            // after done, release the ImageProxy object
            imageProxy.close();
        }
    });

cameraProvider.bindToLifecycle((LifecycleOwner) this, cameraSelector, imageAnalysis, preview);

Ek kaynaklar

CameraX hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın.

Kod Laboratuvarı

  • CameraX'i Kullanmaya Başlama
  • Kod örneği

  • CameraX örnek uygulamaları