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: belgeleriSTRATEGY_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 sunmaktır. 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 en iyi performansı sunan 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:
ImageAnalysis
oluşturun ne kadar iyi karşıladığını görebileceksiniz.- Bir metin oluştur:
ImageAnalysis.Analyzer
. - Analiz aracınızı
ImageAnalysis
cihazınıza ayarlayın. - Bağla
yaşam döngüsü sahibi, kamera seçici ve
ImageAnalysis
kullanım alanınız takip eder.
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:
- Resim çıkış parametreleri:
- Biçim: CameraX'i destekler
YUV_420_888
veRGBA_8888
setOutputImageFormat(int)
aracılığıyla. Varsayılan biçimYUV_420_888
şeklindedir. - Çözüm ve AspectRatio: Bu parametrelerden herhangi birini ayarlayabilirsiniz, ancak ikisini birden ayarlayamayacağınızı unutmayın eş zamanlı olarak görüntüleyebilirsiniz.
- Rotasyon.
- Hedef Ad: Hata ayıklama amacıyla bu parametreyi kullanın.
- Biçim: CameraX'i destekler
- Resim akışı kontrolleri:
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
istediyseImageFormat.RGBA_8888
. - Uygulama
OUTPUT_IMAGE_FORMAT_YUV_420_888
istediyseImageFormat.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:
- 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.
- Şu numarayı arayarak
ImageProxy
cihazını CameraX'e bırakınImageProxy.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ı
Kod örneği