Android'de ML Kit ile pozları algılama

ML Kit, poz algılama için optimize edilmiş iki SDK sunar.

SDK Adıpoz algılamapoz-algılama-doğru
UygulamaKod ve öğeler, derleme sırasında statik olarak uygulamanıza bağlıdır.Kod ve öğeler, derleme sırasında statik olarak uygulamanıza bağlıdır.
Uygulama boyutu etkisi (kod ve öğeler dahil)~10,1 MB~13,3 MB
PerformansPixel 3XL: ~30FPSPixel 3XL: CPU ile ~23FPS, GPU ile ~30FPS

Deneyin

Başlamadan önce

  1. Proje düzeyindeki build.gradle dosyanızda, Google'ın Maven deposunu hem buildscript hem de allprojects bölümlerinize eklediğinizden emin olun.
  2. ML Kit Android kitaplıklarının bağımlılıklarını, modülünüzün uygulama düzeyindeki Gradle dosyasına ekleyin. Bu dosya genellikle app/build.gradle olur:

    dependencies {
      // If you want to use the base sdk
      implementation 'com.google.mlkit:pose-detection:18.0.0-beta4'
      // If you want to use the accurate sdk
      implementation 'com.google.mlkit:pose-detection-accurate:18.0.0-beta4'
    }
    

1. PoseDetector örneği oluşturun

PoseDetector seçeneği

Bir görüntüdeki pozu algılamak için önce PoseDetector örneği oluşturun ve isteğe bağlı olarak algılayıcı ayarlarını belirtin.

Algılama modu

PoseDetector, iki algılama modunda çalışır. Kullanım alanınıza uygun olanı seçtiğinizden emin olun.

STREAM_MODE (varsayılan)
Poz algılayıcısı, önce resimdeki en belirgin kişiyi algılar ve ardından poz algılamayı çalıştırır. Sonraki çerçevelerde, kişinin kimliği belirsiz olmadığı veya artık yüksek güvenilirlikle algılanmadığı sürece kişi algılama adımı gerçekleştirilmez. Poz algılayıcı, en belirgin kişiyi izlemeye ve her çıkarımda pozisyonunu geri döndürmeye çalışır. Bu, gecikmeyi azaltır ve algılama sürecini kolaylaştırır. Video akışında pozu algılamak istediğinizde bu modu kullanın.
SINGLE_IMAGE_MODE
Poz dedektörü kişi algılayıp poz algılamayı çalıştırır. Kişi algılama adımı her resim için çalışır. Bu nedenle gecikme daha yüksek olur ve kişi izleme yapılmaz. Statik resimlerde poz algılama özelliğini kullanırken veya izlemenin istenmediği durumlarda bu modu kullanın.

Donanım yapılandırması

PoseDetector, performansı optimize etmek için birden fazla donanım yapılandırmasını destekler:

  • CPU: Algılayıcıyı yalnızca CPU kullanarak çalıştırın
  • CPU_GPU: algılayıcıyı hem CPU hem de GPU kullanarak çalıştır

Algılayıcı seçeneklerini oluştururken donanım seçimini kontrol etmek için setPreferredHardwareConfigs API'sini kullanabilirsiniz. Varsayılan olarak, tüm donanım yapılandırmaları tercih edilen şekilde ayarlanır.

ML Kit her yapılandırmanın kullanılabilirliğini, kararlılığını, doğruluğunu ve gecikmesini dikkate alır ve tercih edilen yapılandırmalar arasından en iyisini seçer. Tercih edilen yapılandırmaların hiçbiri geçerli değilse CPU yapılandırması otomatik olarak yedek olarak kullanılır. ML Kit, herhangi bir hızlanmayı etkinleştirmeden önce bu kontrolleri ve ilgili hazırlıkları engelsiz bir şekilde gerçekleştirir. Bu nedenle, kullanıcı büyük olasılıkla algılayıcıyı ilk kez çalıştırdığında CPU kullanır. Tüm hazırlıklar tamamlandıktan sonra, sonraki çalıştırmalarda en iyi yapılandırma kullanılacaktır.

setPreferredHardwareConfigs kullanımlarına ilişkin örnekler:

  • ML Kit'in en iyi yapılandırmayı seçmesine izin vermek için bu API'yi çağırmayın.
  • Hızlandırmayı etkinleştirmek istemiyorsanız yalnızca CPU geçirin.
  • GPU daha yavaş olsa bile CPU'yu boşaltmak için GPU kullanmak istiyorsanız yalnızca CPU_GPU değerini geçirin.

Poz algılayıcı seçeneklerini belirtin:

Kotlin

// Base pose detector with streaming frames, when depending on the pose-detection sdk
val options = PoseDetectorOptions.Builder()
    .setDetectorMode(PoseDetectorOptions.STREAM_MODE)
    .build()

// Accurate pose detector on static images, when depending on the pose-detection-accurate sdk
val options = AccuratePoseDetectorOptions.Builder()
    .setDetectorMode(AccuratePoseDetectorOptions.SINGLE_IMAGE_MODE)
    .build()

Java

// Base pose detector with streaming frames, when depending on the pose-detection sdk
PoseDetectorOptions options =
   new PoseDetectorOptions.Builder()
       .setDetectorMode(PoseDetectorOptions.STREAM_MODE)
       .build();

// Accurate pose detector on static images, when depending on the pose-detection-accurate sdk
AccuratePoseDetectorOptions options =
   new AccuratePoseDetectorOptions.Builder()
       .setDetectorMode(AccuratePoseDetectorOptions.SINGLE_IMAGE_MODE)
       .build();

Son olarak, PoseDetector örneği oluşturun. Belirttiğiniz seçenekleri iletin:

Kotlin

val poseDetector = PoseDetection.getClient(options)

Java

PoseDetector poseDetector = PoseDetection.getClient(options);

2. Giriş görüntüsünü hazırlama

Resimlerdeki pozları algılamak için Bitmap, media.Image, ByteBuffer, bayt dizisi veya cihazdaki bir dosyadan InputImage nesnesi oluşturun. Ardından, InputImage nesnesini PoseDetector öğesine iletin.

Poz algılama için en az 480x360 piksel boyutunda bir resim kullanmanız gerekir. Pozları gerçek zamanlı olarak algılıyorsanız kareleri bu minimum çözünürlükte yakalamak, gecikmenin azaltılmasına yardımcı olabilir.

Farklı kaynaklardan InputImage nesnesi oluşturabilirsiniz. Nesnelerin her biri aşağıda açıklanmıştır.

media.Image kullanılıyor

Bir media.Image nesnesinden InputImage nesnesi oluşturmak için (örneğin, bir cihazın kamerasından resim çekerken) media.Image nesnesini ve resmin dönüşünü InputImage.fromMediaImage() konumuna getirin.

KameraX kitaplığını kullanırsanız OnImageCapturedListener ve ImageAnalysis.Analyzer sınıfları, döndürme değerini sizin için hesaplar.

Kotlin

private class YourImageAnalyzer : ImageAnalysis.Analyzer {

    override fun analyze(imageProxy: ImageProxy) {
        val mediaImage = imageProxy.image
        if (mediaImage != null) {
            val image = InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees)
            // Pass image to an ML Kit Vision API
            // ...
        }
    }
}

Java

private class YourAnalyzer implements ImageAnalysis.Analyzer {

    @Override
    public void analyze(ImageProxy imageProxy) {
        Image mediaImage = imageProxy.getImage();
        if (mediaImage != null) {
          InputImage image =
                InputImage.fromMediaImage(mediaImage, imageProxy.getImageInfo().getRotationDegrees());
          // Pass image to an ML Kit Vision API
          // ...
        }
    }
}

Resmin dönüş derecesini belirten bir kamera kitaplığı kullanmıyorsanız bunu cihazın döndürme derecesinden ve cihazdaki kamera sensörünün yönüne göre hesaplayabilirsiniz:

Kotlin

private val ORIENTATIONS = SparseIntArray()

init {
    ORIENTATIONS.append(Surface.ROTATION_0, 0)
    ORIENTATIONS.append(Surface.ROTATION_90, 90)
    ORIENTATIONS.append(Surface.ROTATION_180, 180)
    ORIENTATIONS.append(Surface.ROTATION_270, 270)
}

/**
 * Get the angle by which an image must be rotated given the device's current
 * orientation.
 */
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Throws(CameraAccessException::class)
private fun getRotationCompensation(cameraId: String, activity: Activity, isFrontFacing: Boolean): Int {
    // Get the device's current rotation relative to its "native" orientation.
    // Then, from the ORIENTATIONS table, look up the angle the image must be
    // rotated to compensate for the device's rotation.
    val deviceRotation = activity.windowManager.defaultDisplay.rotation
    var rotationCompensation = ORIENTATIONS.get(deviceRotation)

    // Get the device's sensor orientation.
    val cameraManager = activity.getSystemService(CAMERA_SERVICE) as CameraManager
    val sensorOrientation = cameraManager
            .getCameraCharacteristics(cameraId)
            .get(CameraCharacteristics.SENSOR_ORIENTATION)!!

    if (isFrontFacing) {
        rotationCompensation = (sensorOrientation + rotationCompensation) % 360
    } else { // back-facing
        rotationCompensation = (sensorOrientation - rotationCompensation + 360) % 360
    }
    return rotationCompensation
}

Java

private static final SparseIntArray ORIENTATIONS = new SparseIntArray();
static {
    ORIENTATIONS.append(Surface.ROTATION_0, 0);
    ORIENTATIONS.append(Surface.ROTATION_90, 90);
    ORIENTATIONS.append(Surface.ROTATION_180, 180);
    ORIENTATIONS.append(Surface.ROTATION_270, 270);
}

/**
 * Get the angle by which an image must be rotated given the device's current
 * orientation.
 */
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private int getRotationCompensation(String cameraId, Activity activity, boolean isFrontFacing)
        throws CameraAccessException {
    // Get the device's current rotation relative to its "native" orientation.
    // Then, from the ORIENTATIONS table, look up the angle the image must be
    // rotated to compensate for the device's rotation.
    int deviceRotation = activity.getWindowManager().getDefaultDisplay().getRotation();
    int rotationCompensation = ORIENTATIONS.get(deviceRotation);

    // Get the device's sensor orientation.
    CameraManager cameraManager = (CameraManager) activity.getSystemService(CAMERA_SERVICE);
    int sensorOrientation = cameraManager
            .getCameraCharacteristics(cameraId)
            .get(CameraCharacteristics.SENSOR_ORIENTATION);

    if (isFrontFacing) {
        rotationCompensation = (sensorOrientation + rotationCompensation) % 360;
    } else { // back-facing
        rotationCompensation = (sensorOrientation - rotationCompensation + 360) % 360;
    }
    return rotationCompensation;
}

Daha sonra, media.Image nesnesini ve döndürme derecesi değerini InputImage.fromMediaImage() öğesine iletin:

Kotlin

val image = InputImage.fromMediaImage(mediaImage, rotation)

Java

InputImage image = InputImage.fromMediaImage(mediaImage, rotation);

Dosya URI'si kullanma

Dosya URI'sinden InputImage nesnesi oluşturmak için uygulama bağlamını ve dosya URI'sini InputImage.fromFilePath() adresine iletin. Bu, kullanıcıdan galeri uygulamasından bir resim seçmesini istemek için bir ACTION_GET_CONTENT amacı kullandığınızda faydalıdır.

Kotlin

val image: InputImage
try {
    image = InputImage.fromFilePath(context, uri)
} catch (e: IOException) {
    e.printStackTrace()
}

Java

InputImage image;
try {
    image = InputImage.fromFilePath(context, uri);
} catch (IOException e) {
    e.printStackTrace();
}

ByteBuffer veya ByteArray kullanma

ByteBuffer veya ByteArray öğesinden InputImage nesnesi oluşturmak için önce daha önce media.Image girişi için açıklandığı gibi resim döndürme derecesini hesaplayın. Ardından, InputImage nesnesini resmin yüksekliği, genişliği, renk kodlama biçimi ve döndürme derecesiyle birlikte arabellek veya diziyle oluşturun:

Kotlin

val image = InputImage.fromByteBuffer(
        byteBuffer,
        /* image width */ 480,
        /* image height */ 360,
        rotationDegrees,
        InputImage.IMAGE_FORMAT_NV21 // or IMAGE_FORMAT_YV12
)
// Or:
val image = InputImage.fromByteArray(
        byteArray,
        /* image width */ 480,
        /* image height */ 360,
        rotationDegrees,
        InputImage.IMAGE_FORMAT_NV21 // or IMAGE_FORMAT_YV12
)

Java

InputImage image = InputImage.fromByteBuffer(byteBuffer,
        /* image width */ 480,
        /* image height */ 360,
        rotationDegrees,
        InputImage.IMAGE_FORMAT_NV21 // or IMAGE_FORMAT_YV12
);
// Or:
InputImage image = InputImage.fromByteArray(
        byteArray,
        /* image width */480,
        /* image height */360,
        rotation,
        InputImage.IMAGE_FORMAT_NV21 // or IMAGE_FORMAT_YV12
);

Bitmap kullanılıyor

Bir Bitmap nesnesinden InputImage nesnesi oluşturmak için aşağıdaki bildirimi yapın:

Kotlin

val image = InputImage.fromBitmap(bitmap, 0)

Java

InputImage image = InputImage.fromBitmap(bitmap, rotationDegree);

Resim, döndürme dereceleriyle birlikte bir Bitmap nesnesiyle temsil edilir.

3. Resmi işle

Hazırlanan InputImage nesnesini PoseDetector'ın process yöntemine geçirin.

Kotlin

Task<Pose> result = poseDetector.process(image)
       .addOnSuccessListener { results ->
           // Task completed successfully
           // ...
       }
       .addOnFailureListener { e ->
           // Task failed with an exception
           // ...
       }

Java

Task<Pose> result =
        poseDetector.process(image)
                .addOnSuccessListener(
                        new OnSuccessListener<Pose>() {
                            @Override
                            public void onSuccess(Pose pose) {
                                // Task completed successfully
                                // ...
                            }
                        })
                .addOnFailureListener(
                        new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                // Task failed with an exception
                                // ...
                            }
                        });

4. Algılanan poz hakkında bilgi alma

Resimde kişi algılanırsa poz algılama API'si, 33 PoseLandmark içeren bir Pose nesnesi döndürür.

Kişi resmin içinde tam olarak yer almıyorsa model, eksik önemli nokta koordinatlarını çerçevenin dışına atar ve bunlara düşük InFrameConfidence değerleri verir.

Çerçevede hiç kimse algılanmazsa Pose nesnesinde PoseLandmark bulunmaz.

Kotlin

// Get all PoseLandmarks. If no person was detected, the list will be empty
val allPoseLandmarks = pose.getAllPoseLandmarks()

// Or get specific PoseLandmarks individually. These will all be null if no person
// was detected
val leftShoulder = pose.getPoseLandmark(PoseLandmark.LEFT_SHOULDER)
val rightShoulder = pose.getPoseLandmark(PoseLandmark.RIGHT_SHOULDER)
val leftElbow = pose.getPoseLandmark(PoseLandmark.LEFT_ELBOW)
val rightElbow = pose.getPoseLandmark(PoseLandmark.RIGHT_ELBOW)
val leftWrist = pose.getPoseLandmark(PoseLandmark.LEFT_WRIST)
val rightWrist = pose.getPoseLandmark(PoseLandmark.RIGHT_WRIST)
val leftHip = pose.getPoseLandmark(PoseLandmark.LEFT_HIP)
val rightHip = pose.getPoseLandmark(PoseLandmark.RIGHT_HIP)
val leftKnee = pose.getPoseLandmark(PoseLandmark.LEFT_KNEE)
val rightKnee = pose.getPoseLandmark(PoseLandmark.RIGHT_KNEE)
val leftAnkle = pose.getPoseLandmark(PoseLandmark.LEFT_ANKLE)
val rightAnkle = pose.getPoseLandmark(PoseLandmark.RIGHT_ANKLE)
val leftPinky = pose.getPoseLandmark(PoseLandmark.LEFT_PINKY)
val rightPinky = pose.getPoseLandmark(PoseLandmark.RIGHT_PINKY)
val leftIndex = pose.getPoseLandmark(PoseLandmark.LEFT_INDEX)
val rightIndex = pose.getPoseLandmark(PoseLandmark.RIGHT_INDEX)
val leftThumb = pose.getPoseLandmark(PoseLandmark.LEFT_THUMB)
val rightThumb = pose.getPoseLandmark(PoseLandmark.RIGHT_THUMB)
val leftHeel = pose.getPoseLandmark(PoseLandmark.LEFT_HEEL)
val rightHeel = pose.getPoseLandmark(PoseLandmark.RIGHT_HEEL)
val leftFootIndex = pose.getPoseLandmark(PoseLandmark.LEFT_FOOT_INDEX)
val rightFootIndex = pose.getPoseLandmark(PoseLandmark.RIGHT_FOOT_INDEX)
val nose = pose.getPoseLandmark(PoseLandmark.NOSE)
val leftEyeInner = pose.getPoseLandmark(PoseLandmark.LEFT_EYE_INNER)
val leftEye = pose.getPoseLandmark(PoseLandmark.LEFT_EYE)
val leftEyeOuter = pose.getPoseLandmark(PoseLandmark.LEFT_EYE_OUTER)
val rightEyeInner = pose.getPoseLandmark(PoseLandmark.RIGHT_EYE_INNER)
val rightEye = pose.getPoseLandmark(PoseLandmark.RIGHT_EYE)
val rightEyeOuter = pose.getPoseLandmark(PoseLandmark.RIGHT_EYE_OUTER)
val leftEar = pose.getPoseLandmark(PoseLandmark.LEFT_EAR)
val rightEar = pose.getPoseLandmark(PoseLandmark.RIGHT_EAR)
val leftMouth = pose.getPoseLandmark(PoseLandmark.LEFT_MOUTH)
val rightMouth = pose.getPoseLandmark(PoseLandmark.RIGHT_MOUTH)

Java

// Get all PoseLandmarks. If no person was detected, the list will be empty
List<PoseLandmark> allPoseLandmarks = pose.getAllPoseLandmarks();

// Or get specific PoseLandmarks individually. These will all be null if no person
// was detected
PoseLandmark leftShoulder = pose.getPoseLandmark(PoseLandmark.LEFT_SHOULDER);
PoseLandmark rightShoulder = pose.getPoseLandmark(PoseLandmark.RIGHT_SHOULDER);
PoseLandmark leftElbow = pose.getPoseLandmark(PoseLandmark.LEFT_ELBOW);
PoseLandmark rightElbow = pose.getPoseLandmark(PoseLandmark.RIGHT_ELBOW);
PoseLandmark leftWrist = pose.getPoseLandmark(PoseLandmark.LEFT_WRIST);
PoseLandmark rightWrist = pose.getPoseLandmark(PoseLandmark.RIGHT_WRIST);
PoseLandmark leftHip = pose.getPoseLandmark(PoseLandmark.LEFT_HIP);
PoseLandmark rightHip = pose.getPoseLandmark(PoseLandmark.RIGHT_HIP);
PoseLandmark leftKnee = pose.getPoseLandmark(PoseLandmark.LEFT_KNEE);
PoseLandmark rightKnee = pose.getPoseLandmark(PoseLandmark.RIGHT_KNEE);
PoseLandmark leftAnkle = pose.getPoseLandmark(PoseLandmark.LEFT_ANKLE);
PoseLandmark rightAnkle = pose.getPoseLandmark(PoseLandmark.RIGHT_ANKLE);
PoseLandmark leftPinky = pose.getPoseLandmark(PoseLandmark.LEFT_PINKY);
PoseLandmark rightPinky = pose.getPoseLandmark(PoseLandmark.RIGHT_PINKY);
PoseLandmark leftIndex = pose.getPoseLandmark(PoseLandmark.LEFT_INDEX);
PoseLandmark rightIndex = pose.getPoseLandmark(PoseLandmark.RIGHT_INDEX);
PoseLandmark leftThumb = pose.getPoseLandmark(PoseLandmark.LEFT_THUMB);
PoseLandmark rightThumb = pose.getPoseLandmark(PoseLandmark.RIGHT_THUMB);
PoseLandmark leftHeel = pose.getPoseLandmark(PoseLandmark.LEFT_HEEL);
PoseLandmark rightHeel = pose.getPoseLandmark(PoseLandmark.RIGHT_HEEL);
PoseLandmark leftFootIndex = pose.getPoseLandmark(PoseLandmark.LEFT_FOOT_INDEX);
PoseLandmark rightFootIndex = pose.getPoseLandmark(PoseLandmark.RIGHT_FOOT_INDEX);
PoseLandmark nose = pose.getPoseLandmark(PoseLandmark.NOSE);
PoseLandmark leftEyeInner = pose.getPoseLandmark(PoseLandmark.LEFT_EYE_INNER);
PoseLandmark leftEye = pose.getPoseLandmark(PoseLandmark.LEFT_EYE);
PoseLandmark leftEyeOuter = pose.getPoseLandmark(PoseLandmark.LEFT_EYE_OUTER);
PoseLandmark rightEyeInner = pose.getPoseLandmark(PoseLandmark.RIGHT_EYE_INNER);
PoseLandmark rightEye = pose.getPoseLandmark(PoseLandmark.RIGHT_EYE);
PoseLandmark rightEyeOuter = pose.getPoseLandmark(PoseLandmark.RIGHT_EYE_OUTER);
PoseLandmark leftEar = pose.getPoseLandmark(PoseLandmark.LEFT_EAR);
PoseLandmark rightEar = pose.getPoseLandmark(PoseLandmark.RIGHT_EAR);
PoseLandmark leftMouth = pose.getPoseLandmark(PoseLandmark.LEFT_MOUTH);
PoseLandmark rightMouth = pose.getPoseLandmark(PoseLandmark.RIGHT_MOUTH);

Performansı artırmaya yönelik ipuçları

Sonuçlarınızın kalitesi, giriş görüntüsünün kalitesine bağlıdır:

  • ML Kit'in pozu doğru bir şekilde algılayabilmesi için resimdeki kişi yeterli piksel verisiyle temsil edilmelidir. En iyi performans için ise özne en az 256x256 piksel olmalıdır.
  • Pozu gerçek zamanlı bir uygulamada tespit ederseniz giriş resimlerinin genel boyutlarını da hesaba katmak isteyebilirsiniz. Daha küçük resimler daha hızlı işlenebilir, bu nedenle gecikmeyi azaltmak için düşük çözünürlüklerde görüntü yakalayın ancak yukarıdaki çözünürlük gereksinimlerini göz önünde bulundurun ve öznenin resmi olabildiğince kapladığından emin olun.
  • Kötü resim odağı, doğruluğu da etkileyebilir. Kabul edilebilir sonuçlar alamazsanız kullanıcıdan resmi tekrar çekmesini isteyin.

Gerçek zamanlı bir uygulamada poz algılamayı kullanmak istiyorsanız en iyi kare hızlarını elde etmek için aşağıdaki yönergeleri uygulayın:

  • Temel poz algılama SDK'sını ve STREAM_MODE öğesini kullanın.
  • Daha düşük çözünürlükte resimler çekmeyi deneyin. Ancak, bu API'nin resim boyutu koşullarını da göz önünde bulundurun.
  • Camera veya camera2 API kullanıyorsanız algılayıcıya yapılan çağrıları daraltın. Algılayıcı çalışırken yeni bir video karesi kullanılabilir hale gelirse kareyi bırakın. Örnek için hızlı başlangıç örnek uygulamasındaki VisionProcessorBase sınıfına bakın.
  • CameraX API'yi kullanıyorsanız geri basınç stratejisinin varsayılan değeri ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST olarak ayarlandığından emin olun. Bu, analiz için tek seferde yalnızca bir görüntünün gönderilmesini garanti eder. Analiz aracı meşgulken daha fazla görüntü üretilirse bu görüntüler otomatik olarak bırakılır ve teslim edilmek üzere sıraya alınmaz. Analiz edilen resim, ImageProxy.close() çağrısı yapılarak kapatıldıktan sonra, bir sonraki en son resim yayınlanır.
  • Algılayıcının çıkışını giriş görüntüsünün üzerine grafik yerleştirmek için kullanırsanız önce sonucu ML Kit'ten alın, ardından görüntüyü ve yer paylaşımını tek bir adımda oluşturun. Bu işlem, her giriş çerçevesi için ekran yüzeyinde yalnızca bir kez oluşturulur. Örnek için hızlı başlangıç örnek uygulamasındaki CameraSourcePreview ve GraphicOverlay sınıflarına göz atın.
  • Camera2 API'sini kullanıyorsanız görüntüleri ImageFormat.YUV_420_888 biçiminde yakalayın. Eski Camera API'sini kullanıyorsanız görüntüleri ImageFormat.NV21 biçiminde çekin.

Sonraki adımlar

  • Pozları sınıflandırmak amacıyla poz önemli noktalarının nasıl kullanılacağını öğrenmek için Poz Sınıflandırma İpuçları sayfasına bakın.