Posen mit ML Kit für Android erkennen

<ph type="x-smartling-placeholder">

ML Kit bietet zwei optimierte SDKs für die Posenerkennung.

<ph type="x-smartling-placeholder">
SDK-NamePose-ErkennungPose-Erkennung-genau
ImplementierungDer Code und die Assets werden zum Zeitpunkt der Erstellung statisch mit Ihrer App verknüpft.Der Code und die Assets werden zum Zeitpunkt der Erstellung statisch mit Ihrer App verknüpft.
Auswirkungen auf die App-Größe (einschließlich Code und Assets)~10,1 MB~13,3 MB
LeistungPixel 3 XL: ~30 fpsPixel 3 XL: ~23 fps mit CPU, ~30 fps mit GPU

Jetzt ausprobieren

  • Probieren Sie die Beispiel-App aus, um sehen Sie sich ein Anwendungsbeispiel für diese API an.

Hinweis

<ph type="x-smartling-placeholder">
  1. Fügen Sie in der Datei build.gradle auf Projektebene das Maven-Repository von Google in die Abschnitte buildscript und allprojects ein.
  2. Fügen Sie die Abhängigkeiten für die ML Kit-Android-Bibliotheken in die Gradle-Datei auf App-Ebene Ihres Moduls ein, die normalerweise app/build.gradle ist:

    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. Instanz von PoseDetector erstellen

Optionen für PoseDetector

Um eine Pose in einem Bild zu erkennen, erstellen Sie zuerst eine Instanz von PoseDetector und die Detektoreinstellungen optional.

Erkennungsmodus

PoseDetector wird in zwei Erkennungsmodi ausgeführt. Achten Sie darauf, dass Sie diejenige auswählen, Ihren Anwendungsfall.

STREAM_MODE (Standard)
Die Positionserkennung erkennt zuerst die meisten eine bekannte Person auf dem Bild und führen Sie dann die Posenerkennung durch. In den nachfolgenden Frames wird der Schritt der Personenentdeckung erst durchgeführt, wenn die Person oder nicht mehr mit hoher Zuverlässigkeit erkannt werden. Die Pose-Erkennung Sie versuchen, die bekannteste Person zu verfolgen und jeweils ihre Position zurückzugeben. Inferenz. Dadurch wird die Latenz verringert und die Erkennung optimiert. Verwenden Sie diesen Modus, wenn Sie eine Pose in einem Videostream zu erkennen.
SINGLE_IMAGE_MODE
Die Positionserkennung erkennt eine Person und läuft die Pose -Erkennung. Der Schritt zur Personenentdeckung wird für jedes Bild ausgeführt, und es gibt keine Personenverfolgung. Diesen Modus in Pose verwenden Erkennung bei statischen Bildern oder bei Geräten, bei denen das Tracking nicht erwünscht ist.

Hardwarekonfiguration

Der PoseDetector unterstützt mehrere Hardwarekonfigurationen zur Optimierung Leistung:

  • CPU: Detektor nur über die CPU ausführen
  • CPU_GPU: Führen Sie den Detektor sowohl mit CPU als auch mit GPU aus

Beim Erstellen der Detektoroptionen können Sie die API setPreferredHardwareConfigs, um die Auswahl der Hardware zu steuern. Standardmäßig dass alle Hardwarekonfigurationen als bevorzugt festgelegt sind.

ML Kit prüft Verfügbarkeit, Stabilität, Richtigkeit und Latenz jeder Konfiguration und wählen Sie die beste aus den bevorzugten Konfigurationen aus. Wenn keiner der folgenden Werte Wenn die bevorzugten Konfigurationen anwendbar sind, wird die Konfiguration CPU automatisch verwendet als Fallback festlegen. ML Kit führt diese Prüfungen und die entsprechende Vorbereitung in einem bevor die Beschleunigung aktiviert wird. Wenn der Nutzer den Detektor zum ersten Mal ausführt, wird CPU verwendet. Nach all den Vorbereitung abgeschlossen ist, wird in den folgenden Ausführungen die beste Konfiguration verwendet.

Verwendungsbeispiele für setPreferredHardwareConfigs:

  • Rufen Sie diese API nicht auf, damit ML Kit die beste Konfiguration auswählen kann.
  • Wenn Sie keine Beschleunigung aktivieren möchten, geben Sie nur CPU ein.
  • Wenn Sie die CPU nutzen möchten, um die CPU auszulagern, auch wenn die GPU langsamer sein könnte, übergeben Sie nur in CPU_GPU.

Legen Sie die Optionen für die Positionserkennung fest:

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();

Erstellen Sie abschließend eine Instanz von PoseDetector. Übergeben Sie die angegebenen Optionen:

Kotlin

val poseDetector = PoseDetection.getClient(options)

Java

PoseDetector poseDetector = PoseDetection.getClient(options);

2. Eingabebild vorbereiten

Erstellen Sie ein InputImage-Objekt, um Posen in einem Bild zu erkennen aus einem Bitmap-, media.Image-, ByteBuffer-, Byte-Array oder einer Datei in auf dem Gerät. Übergeben Sie dann das InputImage-Objekt an die PoseDetector.

Für die Posenerkennung solltest du ein Bild mit mindestens den Abmessungen verwenden 480 x 360 Pixel. Wenn Sie Posen in Echtzeit erkennen, bei dieser Mindestauflösung kann die Latenz verringert werden.

Sie können eine InputImage erstellen aus verschiedenen Quellen stammen. Diese werden im Folgenden erläutert.

Mit einem media.Image

So erstellen Sie eine InputImage: media.Image-Objekts erstellen, beispielsweise wenn Sie ein Bild von einem des Geräts an, übergeben Sie das media.Image-Objekt und die Drehung auf InputImage.fromMediaImage().

Wenn Sie das <ph type="x-smartling-placeholder"></ph> CameraX-Bibliothek, den OnImageCapturedListener und ImageAnalysis.Analyzer-Klassen berechnen den Rotationswert für Sie.

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
          // ...
        }
    }
}

Wenn Sie keine Kamerabibliothek verwenden, die Ihnen den Drehungsgrad des Bildes anzeigt, lässt sich anhand des Drehungsgrads des Geräts und der Ausrichtung der Kamera berechnen. Sensor im Gerät:

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;
}

Übergeben Sie dann das media.Image-Objekt und den Wert für Rotationsgrad auf InputImage.fromMediaImage():

Kotlin

val image = InputImage.fromMediaImage(mediaImage, rotation)

Java

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

Datei-URI verwenden

So erstellen Sie eine InputImage: aus einem Datei-URI entfernen möchten, übergeben Sie den App-Kontext und den Datei-URI an InputImage.fromFilePath(). Dies ist nützlich, wenn Sie Verwenden Sie den Intent ACTION_GET_CONTENT, um den Nutzer zur Auswahl aufzufordern ein Bild aus ihrer Galerie-App.

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 oder ByteArray verwenden

So erstellen Sie eine InputImage: aus einem ByteBuffer- oder ByteArray-Objekt zu erstellen, berechnen Sie Drehung wie zuvor für die media.Image-Eingabe beschrieben. Erstellen Sie dann das InputImage-Objekt mit dem Zwischenspeicher oder Array Höhe, Breite, Farbcodierungsformat und Drehungsgrad:

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
);

Mit einem Bitmap

So erstellen Sie eine InputImage: Bitmap-Objekt zu erstellen, nehmen Sie folgende Deklaration vor:

Kotlin

val image = InputImage.fromBitmap(bitmap, 0)

Java

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

Das Bild wird durch ein Bitmap-Objekt in Verbindung mit Drehungsgrad dargestellt.

3. Bild verarbeiten

Übergeben Sie das vorbereitete InputImage-Objekt an die Methode process des PoseDetector.

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
                                // ...
                            }
                        });
<ph type="x-smartling-placeholder">

4. Informationen zur erkannten Pose abrufen

Wenn eine Person auf dem Bild erkannt wird, gibt die POS Detection API eine Pose zurück. Objekt mit 33 PoseLandmarken.

Wenn sich die Person nicht ganz im Bild befand, weist das Modell der fehlenden Orientierungspunkte außerhalb des Frames InFrameConfidence-Werten.

Wenn keine Person im Bild erkannt wurde: Pose Objekt enthält keine PoseLandmarks.

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);

Tipps zur Verbesserung der Leistung

Die Qualität Ihrer Ergebnisse hängt von der Qualität des Eingabebildes ab:

  • Damit ML Kit die Pose genau erkennen kann, sollte die Person auf dem Bild ausreichende Pixeldaten dargestellt werden. um eine optimale Leistung zu erzielen, mindestens 256 x 256 Pixel groß sein.
  • Wenn Sie in einer Echtzeitanwendung Posen erkennen, sollten Sie die Gesamtabmessungen der Eingabebilder. Kleinere Bilder können verarbeitet werden Um die Latenz zu verringern, nehmen Sie Bilder mit geringerer Auflösung auf, an die oben genannten Anforderungen an die Auflösung zu denken und sicherzustellen, dass die Person möglichst viel vom Bild zu sehen.
  • Ein schlechter Bildfokus kann auch die Genauigkeit beeinträchtigen. Wenn Sie keine akzeptablen Ergebnisse erhalten, den Nutzer bitten, das Bild erneut aufzunehmen.

Wenn du die Posenerkennung in einer Echtzeitanwendung verwenden möchtest, solltest du die folgenden Richtlinien beachten, um die besten Framerates zu erzielen:

  • Verwende das Basis-SDK für die Pose-Erkennung und STREAM_MODE.
  • Nehmen Sie Bilder mit einer niedrigeren Auflösung auf. Beachten Sie jedoch auch die Anforderungen dieser API an die Bildabmessungen.
  • Wenn Sie das Camera oder camera2 API, drosselt Aufrufe an den Detektor. Wenn ein neues Video wenn der Detektor aktiv ist, lassen Sie den Frame weg. Weitere Informationen finden Sie in der <ph type="x-smartling-placeholder"></ph> VisionProcessorBase in der Beispielanwendung „Kurzanleitung“ finden Sie ein Beispiel.
  • Wenn Sie die CameraX API verwenden, Achten Sie darauf, dass die Rückstaustrategie auf den Standardwert eingestellt ist ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST Dadurch wird garantiert, dass jeweils nur ein Bild zur Analyse geliefert wird. Wenn weitere Bilder wenn der Analysator beschäftigt ist, werden sie automatisch abgebrochen und nicht in die Warteschlange Auslieferung. Sobald das zu analysierende Bild durch Aufrufen ImageProxy.close() wird das nächste Bild geliefert.
  • Wenn Sie die Ausgabe des Detektors verwenden, um Grafiken Eingabebild, rufen Sie zuerst das Ergebnis aus ML Kit ab und rendern Sie das Bild in einem Schritt übereinanderlegen. Dadurch wird die Anzeigeoberfläche gerendert, für jeden Eingabe-Frame nur einmal. Weitere Informationen finden Sie in der <ph type="x-smartling-placeholder"></ph> CameraSourcePreview und GraphicOverlay-Klassen in der Schnellstart-Beispiel-App als Beispiel.
  • Wenn Sie die Camera2 API verwenden, nehmen Sie Bilder in ImageFormat.YUV_420_888-Format. Wenn Sie die ältere Camera API verwenden, nehmen Sie Bilder in ImageFormat.NV21-Format.

Nächste Schritte