Görüntü analizi kullanım alanı, uygulamanıza CPU tarafından erişilebilen bir görüntü sağlar. Bu görüntü üzerinde görüntü işleme, bilgisayar görüşü veya makine öğrenimi çıkarımı yapabilirsiniz. Uygulama, her karede çalıştırılan bir analyze() yöntemini uygular.
Google'ın ML Kit'ini CameraX uygulamanıza nasıl entegre edeceğinizi öğrenmek için ML Kit Analyzer'a bakın.
Çalışma Modları
Uygulamanın analiz ardışık düzeni, CameraX'in kare hızı koşullarını karşılayamadığında CameraX, kareleri aşağıdaki yöntemlerden biriyle bırakacak şekilde yapılandırılabilir:
non-blocking (varsayılan): Bu modda, uygulama önceki resmi analiz ederken yürütücü her zaman en son resmi bir resim arabelleğine (derinliği bir olan bir sıraya benzer) önbelleğe alır. Uygulama, işleme işlemini tamamlamadan önce CameraX yeni bir görüntü alırsa yeni görüntü aynı arabelleğe kaydedilir ve önceki görüntünün üzerine yazılır. Bu senaryoda
ImageAnalysis.Builder.setImageQueueDepth()parametresinin hiçbir etkisi yoktur ve arabellek içeriklerinin üzerine her zaman yazılır.STRATEGY_KEEP_ONLY_LATESTilesetBackpressureStrategy()yöntemini çağırarak bu engelleme yapmayan modu etkinleştirebilirsiniz. Yürütücü etkileri hakkında daha fazla bilgi içinSTRATEGY_KEEP_ONLY_LATESTile ilgili referans belgelerini inceleyin.blocking: Bu modda, dahili yürütücü dahili resim sırasına birden fazla resim ekleyebilir ve yalnızca sıra dolduğunda kareleri bırakmaya başlar. Engelleme, tüm kamera cihazı kapsamında gerçekleşir: Kamera cihazının birden fazla bağlı kullanım alanı varsa CameraX bu görüntüleri işlerken bu kullanım alanlarının tümü engellenir. Örneğin, hem önizleme hem de görüntü analizi bir kamera cihazına bağlıysa CameraX görüntüleri işlerken önizleme de engellenir.
setBackpressureStrategy()öğesineSTRATEGY_BLOCK_PRODUCERgeçirerek engelleme modunu etkinleştirebilirsiniz. ImageAnalysis.Builder.setImageQueueDepth() kullanarak görüntü sırası derinliğini de yapılandırabilirsiniz.
Bir görüntüyü analiz etmek için gereken toplam sürenin bir CameraX karesinin süresinden (ör. 60 fps için 16 ms) daha kısa olduğu düşük gecikmeli ve yüksek performanslı bir analizörle her iki çalışma modu da sorunsuz bir genel deneyim sunar. Engelleme modu, çok kısa süreli sistem gecikmeleri gibi bazı senaryolarda yine de yararlı olabilir.
Yüksek gecikme süreli ve yüksek performanslı bir analizör kullanıldığında gecikmeyi telafi etmek için daha uzun bir sıraya sahip engelleme modu gerekir. Ancak uygulamanın tüm kareleri işleyebileceğini unutmayın.
Yüksek gecikme süreli ve zaman alan bir analizör (analizör tüm kareleri işleyemez) kullanıldığında, karelerin analiz yolu için bırakılması gerektiğinden engellenmeyen mod daha uygun bir seçim olabilir ancak diğer eşzamanlı bağlı kullanım alanları tüm kareleri görmeye devam edebilir.
Uygulama
Uygulamanızda görüntü analizini kullanmak için aşağıdaki adımları uygulayın:
ImageAnalysiskullanım alanı oluşturun.ImageAnalysis.Analyzeroluşturun.- Analiz aracınızı
ImageAnalysisolarak ayarlayın. - Yaşam döngüsü sahibinizi, kamera seçicinizi ve
ImageAnalysiskullanım alanınızı yaşam döngüsüne bağlayın.
Bağlama işleminden hemen sonra CameraX, kayıtlı analizörünüze resimler gönderir.
Analiz tamamlandıktan sonra analizi durdurmak için ImageAnalysis.clearAnalyzer() yöntemini çağırın veya ImageAnalysis kullanım alanının bağını kaldırın.
ImageAnalysis kullanım alanını oluşturma
ImageAnalysis, analiz aracınızı (görüntü tüketicisi) bir görüntü üreticisi olan CameraX'e bağlar.
Uygulamalar, ImageAnalysis nesnesi oluşturmak için ImageAnalysis.Builder kullanabilir. ImageAnalysis.Builder ile uygulama,
aşağıdakileri yapılandırabilir:
- Resim çıkış parametreleri:
- Biçim: CameraX,
setOutputImageFormat(int)aracılığıylaYUV_420_888veRGBA_8888biçimlerini destekler. Varsayılan biçimYUV_420_888şeklindedir. - Resolution ve AspectRatio: Bu parametrelerden birini ayarlayabilirsiniz ancak her iki değeri aynı anda ayarlayamazsınız.
- Rotasyon.
- Hedef Adı: Bu parametreyi hata ayıklama amacıyla kullanın.
- Biçim: CameraX,
- Resim akışı denetimleri:
Uygulamalar çözünürlüğü veya en boy oranını ayarlayabilir ancak ikisini birden ayarlayamaz. Tam çıkış çözünürlüğü, uygulamanın istediği boyuta (veya en boy oranına) ve donanım özelliklerine bağlıdır. İstenen boyuttan veya orandan farklı olabilir. Çözünürlük eşleştirme algoritması hakkında bilgi için setTargetResolution() ile ilgili belgelere bakın.
Uygulama, çıkış resmi piksellerini YUV (varsayılan) veya RGBA renk uzaylarında olacak şekilde yapılandırabilir. CameraX, RGBA çıkış biçimi ayarlanırken görüntüleri dahili olarak YUV'den RGBA renk alanına dönüştürür ve görüntü bitlerini aşağıdaki sırayla ImageProxy'nin ilk düzleminin (diğer iki düzlem kullanılmaz) ByteBuffer öğesine yerleştirir:
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 kare hızına yetişemediği karmaşık görüntü analizleri yaparken CameraX'i, bu konunun Çalışma Modları bölümünde açıklanan stratejilerle kareleri bırakacak şekilde yapılandırabilirsiniz.
Analiz aracınızı oluşturma
Uygulamalar, ImageAnalysis.Analyzer arayüzünü uygulayarak ve analyze(ImageProxy image) yöntemini geçersiz kılarak analizörler oluşturabilir.
Her analizörde uygulamalar, Media.Image için bir sarmalayıcı olan ImageProxy alır.
Resim biçimi ImageProxy.getFormat() ile sorgulanabilir.
Biçim, uygulamanın ImageAnalysis.Builder ile sağladığı aşağıdaki değerlerden biridir:
- Uygulama
OUTPUT_IMAGE_FORMAT_RGBA_8888izni istediyseImageFormat.RGBA_8888. - Uygulama
OUTPUT_IMAGE_FORMAT_YUV_420_888izni istediyseImageFormat.YUV_420_888.
Renk uzayı yapılandırmaları ve piksel baytlarının nereden alınabileceği hakkında bilgi edinmek için ImageAnalysis kullanım alanı oluşturma bölümüne bakın.
Analizörde uygulama şunları yapmalıdır:
- Belirli bir kareyi mümkün olduğunca hızlı bir şekilde, tercihen verilen kare hızı zaman sınırı içinde (ör. 30 fps için 32 ms'den az) analiz edin. Uygulama bir kareyi yeterince hızlı analiz edemiyorsa desteklenen kare atlama mekanizmalarından birini kullanabilirsiniz.
ImageProxy.close()yöntemini çağırarakImageProxyöğesini CameraX'e bırakın. Sarmalanmış Media.Image'ın close işlevini (Media.Image.close()) çağırmamanız gerektiğini unutmayın.
Uygulamalar, sarmalanmış Media.Image öğesini doğrudan ImageProxy içinde kullanabilir.
Sarmalanmış görüntüde Media.Image.close() yöntemini çağırmayın. Bu, CameraX'teki görüntü paylaşma mekanizmasını bozar. Bunun yerine, temel Media.Image öğesini CameraX'e yayınlamak için ImageProxy.close() yöntemini kullanın.
Analizörünüzü ImageAnalysis için yapılandırma
Analizör oluşturduktan sonra analizi başlatmak için ImageAnalysis.setAnalyzer() kullanarak analizörü kaydedin. Analiziniz bittiğinde kayıtlı analiz aracını kaldırmak için
ImageAnalysis.clearAnalyzer()
komutunu kullanın.
Görüntü analizi için yalnızca bir etkin analizör yapılandırılabilir. Calling
ImageAnalysis.setAnalyzer(), kayıtlı analizör zaten mevcutsa onun yerini alır. Uygulamalar, kullanım alanını bağlamadan önce veya sonra diledikleri zaman yeni bir analizör ayarlayabilir.
ImageAnalysis'i bir yaşam döngüsüne bağlama
ProcessCameraProvider.bindToLifecycle() işleviyle ImageAnalysis öğenizi mevcut bir AndroidX yaşam döngüsüne bağlamanız önemle tavsiye edilir. bindToLifecycle() işlevinin, seçilen Camera cihazı döndürdüğünü unutmayın. Bu cihaz, pozlama gibi gelişmiş ayarlarda ince ayar yapmak için kullanılabilir. Kamera çıkışını kontrol etme hakkında daha fazla bilgi için bu kılavuza bakın.
Aşağıdaki örnekte, önceki adımlardaki her şey birleştirilerek CameraX ImageAnalysis ve Preview kullanım alanları bir lifeCycle sahibine bağlanmaktadır:
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)
Ek kaynaklar
CameraX hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara göz atın.
Codelab
Kod örneği