Guida al riconoscimento dei gesti per iOS

L'attività di riconoscimento dei gesti MediaPipe ti consente di riconoscere i gesti delle mani in tempo reale e fornisce i risultati dei gesti riconosciuti e i punti di riferimento delle mani delle mani rilevate. Queste istruzioni mostrano come utilizzare il riconoscimento gesti con le applicazioni iOS.

Puoi vedere questa attività in azione visualizzando la demo web. Per maggiori informazioni sulle funzionalità, sui modelli e sulle opzioni di configurazione di questa attività, consulta la Panoramica.

Esempio di codice

Il codice di esempio di MediaPipe Tasks è un'implementazione di base di un'app di riconoscimento dei gesti per iOS. L'esempio utilizza la fotocamera di un dispositivo iOS fisico per rilevare continuamente i gesti delle mani e può anche utilizzare immagini e video dalla galleria del dispositivo per rilevare i gesti in modo statico.

Puoi utilizzare l'app come punto di partenza per la tua app per iOS o farvi riferimento quando modifichi un'app esistente. Il codice di esempio di Gesture Recognizer è ospitato su GitHub.

Scarica il codice

Le seguenti istruzioni mostrano come creare una copia locale del codice di esempio utilizzando lo strumento a riga di comando git.

Per scaricare il codice di esempio:

  1. Clona il repository Git utilizzando il seguente comando:

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Facoltativamente, configura l'istanza Git in modo da utilizzare il controllo sparse, in modo da avere solo i file per l'app di esempio Gesture Recognizer:

    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/gesture_recognizer/ios/
    

Dopo aver creato una versione locale del codice di esempio, puoi installare la libreria di attività MediaPipe, aprire il progetto utilizzando Xcode ed eseguire l'app. Per le istruzioni, consulta la Guida alla configurazione per iOS.

Componenti chiave

I seguenti file contengono il codice fondamentale per l'applicazione di esempio del Riconoscitore di gesti:

  • GestureRecognizerService.swift: inizializza il riconoscimento gesti, gestisce la selezione del modello ed esegue l'inferenza sui dati di input.
  • CameraViewController.swift: implementa l'interfaccia utente per la modalità di inserimento del feed della videocamera in diretta e visualizza i risultati.
  • MediaLibraryViewController.swift: implementa l'interfaccia utente per la modalità di input di file video e immagini fisse e visualizza i risultati.

Configurazione

Questa sezione descrive i passaggi chiave per configurare l'ambiente di sviluppo e i progetti di codice per utilizzare il Rilevamento dei gesti. Per informazioni generali sulla configurazione dell'ambiente di sviluppo per l'utilizzo delle attività MediaPipe, inclusi i requisiti della versione della piattaforma, consulta la guida alla configurazione per iOS.

Dipendenze

Il riconoscimento gesti utilizza la libreria MediaPipeTasksVision, che deve essere installata tramite CocoaPods. La libreria è compatibile con le app Swift e Objective-C e non richiede alcuna configurazione aggiuntiva specifica per il linguaggio.

Per istruzioni su come installare CocoaPods su macOS, consulta la guida all'installazione di CocoaPods. Per istruzioni su come creare un Podfile con i pod necessari per la tua app, consulta Utilizzare CocoaPods.

Aggiungi il pod MediaPipeTasksVision in Podfile utilizzando il seguente codice:

target 'MyGestureRecognizerApp' do
  use_frameworks!
  pod 'MediaPipeTasksVision'
end

Se la tua app include target dei test delle unità, consulta la Guida alla configurazione per iOS per ulteriori informazioni sulla configurazione di Podfile.

Modello

L'attività di riconoscimento dei gesti MediaPipe richiede un modello addestrato compatibile con questa attività. Per ulteriori informazioni sui modelli addestrati disponibili per il Rilevatore di gesti, consulta la sezione Modelli della panoramica dell'attività.

Seleziona e scarica un modello, quindi aggiungilo alla directory del progetto utilizzando Xcode. Per istruzioni su come aggiungere file al progetto Xcode, consulta la sezione Gestione di file e cartelle nel progetto Xcode.

Utilizza la proprietà BaseOptions.modelAssetPath per specificare il percorso del modello nel tuo app bundle. Per un esempio di codice, consulta la sezione successiva.

Crea l'attività

Puoi creare l'attività Riconoscimento gesti chiamando uno dei suoi inizializzatori. L'inizializzatore GestureRecognizer(options:) accetta i valori per le opzioni di configurazione.

Se non ti occorre un riconoscimento dei gesti inizializzato con opzioni di configurazione personalizzate, puoi utilizzare l'inizializzatore GestureRecognizer(modelPath:) per creare un riconoscimento dei gesti con le opzioni predefinite. Per ulteriori informazioni sulle opzioni di configurazione, consulta Panoramica della configurazione.

L'attività Rilevamento dei gesti supporta tre tipi di dati di input: immagini fisse, file video e live streaming video. Per impostazione predefinita, GestureRecognizer(modelPath:) inizializza un'attività per le immagini statiche. Se vuoi che l'attività venga inizializzata per elaborare file video o stream video in diretta, utilizza GestureRecognizer(options:) per specificare la modalità di esecuzione del video o del live streaming. La modalità di live streaming richiede anche l'opzione di configurazione gestureRecognizerLiveStreamDelegate aggiuntiva, che consente al riconoscimento di gesti di fornire i risultati del riconoscimento dei gesti al delegato in modo asincrono.

Scegli la scheda corrispondente alla tua modalità di esecuzione per vedere come creare l'attività ed eseguire l'inferenza.

Swift

Immagine

import MediaPipeTasksVision

let modelPath = Bundle.main.path(forResource: "gesture_recognizer",
                                      ofType: "task")

let options = GestureRecognizerOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .image
options.minHandDetectionConfidence = minHandDetectionConfidence
options.minHandPresenceConfidence = minHandPresenceConfidence
options.minTrackingConfidence = minHandTrackingConfidence
options.numHands = numHands

let gestureRecognizer = try GestureRecognizer(options: options)
    

Video

import MediaPipeTasksVision

let modelPath = Bundle.main.path(forResource: "gesture_recognizer",
                                      ofType: "task")

let options = GestureRecognizerOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .video
options.minHandDetectionConfidence = minHandDetectionConfidence
options.minHandPresenceConfidence = minHandPresenceConfidence
options.minTrackingConfidence = minHandTrackingConfidence
options.numHands = numHands

let gestureRecognizer = try GestureRecognizer(options: options)
    

Live streaming

import MediaPipeTasksVision

// Class that conforms to the `GestureRecognizerLiveStreamDelegate` protocol and
// implements the method that the gesture recognizer calls once it finishes
// performing recognizing hand gestures in each input frame.
class GestureRecognizerResultProcessor: NSObject, GestureRecognizerLiveStreamDelegate {

  func gestureRecognizer(
    _ gestureRecognizer: GestureRecognizer,
    didFinishRecognition result: GestureRecognizerResult?,
    timestampInMilliseconds: Int,
    error: Error?) {

    // Process the gesture recognizer result or errors here.

  }
}

let modelPath = Bundle.main.path(
  forResource: "gesture_recognizer",
  ofType: "task")

let options = GestureRecognizerOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .liveStream
options.minHandDetectionConfidence = minHandDetectionConfidence
options.minHandPresenceConfidence = minHandPresenceConfidence
options.minTrackingConfidence = minHandTrackingConfidence
options.numHands = numHands

// Assign an object of the class to the `gestureRecognizerLiveStreamDelegate`
// property.
let processor = GestureRecognizerResultProcessor()
options.gestureRecognizerLiveStreamDelegate = processor

let gestureRecognizer = try GestureRecognizer(options: options)
    

Objective-C

Immagine

@import MediaPipeTasksVision;

NSString *modelPath =
  [[NSBundle mainBundle] pathForResource:@"gesture_recognizer"
                                  ofType:@"task"];

MPPGestureRecognizerOptions *options =
  [[MPPGestureRecognizerOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeImage;
options.minHandDetectionConfidence = minHandDetectionConfidence
options.minHandPresenceConfidence = minHandPresenceConfidence
options.minTrackingConfidence = minHandTrackingConfidence
options.numHands = numHands

MPPGestureRecognizer *gestureRecognizer =
      [[MPPGestureRecognizer alloc] initWithOptions:options error:nil];
    

Video

@import MediaPipeTasksVision;

NSString *modelPath =
  [[NSBundle mainBundle] pathForResource:@"gesture_recognizer"
                                  ofType:@"task"];

MPPGestureRecognizerOptions *options =
  [[MPPGestureRecognizerOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeVideo;
options.minHandDetectionConfidence = minHandDetectionConfidence
options.minHandPresenceConfidence = minHandPresenceConfidence
options.minTrackingConfidence = minHandTrackingConfidence
options.numHands = numHands

MPPGestureRecognizer *gestureRecognizer =
      [[MPPGestureRecognizer alloc] initWithOptions:options error:nil];
    

Live streaming

@import MediaPipeTasksVision;

// Class that conforms to the `MPPGestureRecognizerLiveStreamDelegate` protocol
// and implements the method that the gesture recognizer calls once it finishes
// performing gesture recognition on each input frame.

@interface APPGestureRecognizerResultProcessor : NSObject 

@end

@implementation APPGestureRecognizerResultProcessor

-   (void)gestureRecognizer:(MPPGestureRecognizer *)gestureRecognizer
    didFinishRecognitionWithResult:(MPPGestureRecognizerResult *)gestureRecognizerResult
           timestampInMilliseconds:(NSInteger)timestampInMilliseconds
                             error:(NSError *)error {

    // Process the gesture recognizer result or errors here.

}

@end

NSString *modelPath =
  [[NSBundle mainBundle] pathForResource:@"gesture_recognizer"
                                  ofType:@"task"];

MPPGestureRecognizerOptions *options =
  [[MPPGestureRecognizerOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeLiveStream;
options.minHandDetectionConfidence = minHandDetectionConfidence
options.minHandPresenceConfidence = minHandPresenceConfidence
options.minTrackingConfidence = minHandTrackingConfidence
options.numHands = numHands

// Assign an object of the class to the `gestureRecognizerLiveStreamDelegate`
// property.
APPGestureRecognizerResultProcessor *processor =
  [APPGestureRecognizerResultProcessor new];
options.gestureRecognizerLiveStreamDelegate = processor;

MPPGestureRecognizer *gestureRecognizer =
      [[MPPGestureRecognizer alloc] initWithOptions:options error:nil];
    

Opzioni di configurazione

Questa attività offre le seguenti opzioni di configurazione per le app per iOS:

Nome opzione Descrizione Intervallo di valori Valore predefinito
runningMode Imposta la modalità di esecuzione dell'attività. Esistono tre modalità:

IMMAGINE: la modalità per l'inserimento di singole immagini.

VIDEO: la modalità per i fotogrammi decodificati di un video.

LIVE_STREAM: la modalità per un live streaming di dati di input, ad esempio da una videocamera. In questa modalità, resultListener deve essere chiamato per configurare un ascoltatore per ricevere i risultati in modo asincrono. In questa modalità, gestureRecognizerLiveStreamDelegate deve essere impostato su un'istanza di una classe che implementa GestureRecognizerLiveStreamDelegate per ricevere i risultati dell'esecuzione del riconoscimento dei gesti in modo asincrono.
{RunningMode.image, RunningMode.video, RunningMode.liveStream} RunningMode.image
num_hands Il numero massimo di mani può essere rilevato dal GestureRecognizer. Any integer > 0 1
min_hand_detection_confidence Il punteggio di attendibilità minimo per il rilevamento della mano deve essere considerato positivo nel modello di rilevamento del palmo. 0.0 - 1.0 0.5
min_hand_presence_confidence Il punteggio di attendibilità minimo del punteggio di presenza della mano nel modello di rilevamento dei punti di riferimento della mano. In modalità Video e live streaming del riconoscimento gesti, se il punteggio di sicurezza della presenza della mano del modello di punto di riferimento della mano è inferiore a questa soglia, viene attivato il modello di rilevamento del palmo. In caso contrario, viene utilizzato un algoritmo di monitoraggio delle mani snello per determinare la posizione delle mani per il successivo rilevamento di punti di riferimento. 0.0 - 1.0 0.5
min_tracking_confidence Il punteggio di affidabilità minimo affinché il monitoraggio della mano sia considerato riuscito. Questa è la soglia di IoU del riquadro di delimitazione tra le mani nel frame corrente e l'ultimo frame. In modalità Video e in modalità Stream di Rilevamento dei gesti, se il rilevamento non riesce, Rilevamento dei gesti attiva il rilevamento della mano. In caso contrario, il rilevamento della mano viene ignorato. 0.0 - 1.0 0.5
canned_gestures_classifier_options Opzioni per la configurazione del comportamento del classificatore dei gesti predefiniti. I gesti predefiniti sono ["None", "Closed_Fist", "Open_Palm", "Pointing_Up", "Thumb_Down", "Thumb_Up", "Victory", "ILoveYou"]
  • Impostazioni internazionali dei nomi visualizzati: le impostazioni internazionali da utilizzare per i nomi visualizzati specificati tramite i metadati del modello TFLite, se presenti.
  • Risultati massimi: il numero massimo di risultati di classificazione con il punteggio più alto da restituire. Se < 0, verranno restituiti tutti i risultati disponibili.
  • Soglia di punteggio: il punteggio sotto il quale i risultati vengono rifiutati. Se impostato su 0, verranno restituiti tutti i risultati disponibili.
  • Lista consentita delle categorie: la lista consentita dei nomi delle categorie. Se non è vuoto, i risultati di classificazione la cui categoria non è in questo insieme verranno filtrati. Esclusivo con la lista bloccata.
  • Lista bloccata delle categorie: la lista bloccata dei nomi delle categorie. Se non è vuoto, i risultati di classificazione la cui categoria è in questo insieme verranno filtrati. Si escludono a vicenda con la lista consentita.
    • Impostazioni internazionali per i nomi visualizzati: any string
    • Risultati massimi: any integer
    • Soglia di punteggio: 0.0-1.0
    • Lista consentita di categorie: vector of strings
    • Lista bloccata delle categorie: vector of strings
    • Impostazioni internazionali per i nomi visualizzati: "en"
    • Risultati massimi: -1
    • Soglia di punteggio: 0
    • Lista consentita per le categorie: vuota
    • Lista bloccata delle categorie: vuota
    custom_gestures_classifier_options Opzioni per la configurazione del comportamento del classificatore dei gesti personalizzati.
  • Impostazioni internazionali dei nomi visualizzati: le impostazioni internazionali da utilizzare per i nomi visualizzati specificati tramite i metadati del modello TFLite, se presenti.
  • Risultati massimi: il numero massimo di risultati di classificazione con il punteggio più alto da restituire. Se < 0, verranno restituiti tutti i risultati disponibili.
  • Soglia di punteggio: il punteggio sotto il quale i risultati vengono rifiutati. Se impostato su 0, verranno restituiti tutti i risultati disponibili.
  • Lista consentita delle categorie: la lista consentita dei nomi delle categorie. Se non è vuoto, i risultati di classificazione la cui categoria non è in questo insieme verranno filtrati. Esclusivo con la lista bloccata.
  • Lista bloccata delle categorie: la lista bloccata dei nomi delle categorie. Se non è vuoto, i risultati di classificazione la cui categoria è in questo insieme verranno filtrati. Si escludono a vicenda con la lista consentita.
    • Impostazioni internazionali per i nomi visualizzati: any string
    • Risultati massimi: any integer
    • Soglia di punteggio: 0.0-1.0
    • Lista consentita di categorie: vector of strings
    • Lista bloccata delle categorie: vector of strings
    • Impostazioni internazionali per i nomi visualizzati: "en"
    • Risultati massimi: -1
    • Soglia di punteggio: 0
    • Lista consentita per le categorie: vuota
    • Lista bloccata delle categorie: vuota
    result_listener Imposta l'ascoltatore dei risultati in modo da ricevere i risultati di classificazione in modo asincrono quando il riconoscitore dei gesti è in modalità live streaming. Può essere utilizzato solo quando la modalità di esecuzione è impostata su LIVE_STREAM ResultListener N/D N/D

    Quando la modalità di esecuzione è impostata su live streaming, il RICONOSCIMENTO GESTI richiede l'opzione di configurazione aggiuntiva gestureRecognizerLiveStreamDelegate, che consente al RICONOSCIMENTO GESTI di fornire risultati di riconoscimento dei gesti in modo asincrono. Il delegato deve implementare il metodo gestureRecognizer(_:didFinishRecognition:timestampInMilliseconds:error:), che il riconoscimento dei gesti chiama dopo l'elaborazione dei risultati dell'esecuzione del riconoscimento dei gesti su ogni frame.

    Nome opzione Descrizione Intervallo di valori Valore predefinito
    gestureRecognizerLiveStreamDelegate Consente di attivare il riconoscimento dei gesti per ricevere i risultati del riconoscimento dei gesti in modo asincrono in modalità live streaming. La classe la cui istanza è impostata su questa proprietà deve implementare il metodo gestureRecognizer(_:didFinishRecognition:timestampInMilliseconds:error:). Non applicabile Non impostato

    Preparazione dei dati

    Devi convertire l'immagine o l'inquadratura di input in un oggetto MPImage prima di passarlo al Riconoscitore di gesti. MPImage supporta diversi tipi di formati di immagini iOS e può utilizzarli in qualsiasi modalità di esecuzione per l'inferenza. Per ulteriori informazioni su MPImage, consulta l'API MPImage.

    Scegli un formato di immagine iOS in base al tuo caso d'uso e alla modalità di esecuzione richiesta dalla tua applicazione.MPImage accetta i formati di immagine iOS UIImage, CVPixelBuffer e CMSampleBuffer.

    UIImage

    Il formato UIImage è adatto per le seguenti modalità di esecuzione:

    • Immagini: le immagini di un app bundle, della galleria dell'utente o del file system formattate come immagini UIImage possono essere convertite in un oggetto MPImage.

    • Video: utilizza AVAssetImageGenerator per estrarre i frame video nel formato CGImage, quindi convertili in immagini UIImage.

    Swift

    // Load an image on the user's device as an iOS `UIImage` object.
    
    // Convert the `UIImage` object to a MediaPipe's Image object having the default
    // orientation `UIImage.Orientation.up`.
    let image = try MPImage(uiImage: image)
        

    Objective-C

    // Load an image on the user's device as an iOS `UIImage` object.
    
    // Convert the `UIImage` object to a MediaPipe's Image object having the default
    // orientation `UIImageOrientationUp`.
    MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
        

    L'esempio inizializza un MPImage con l'orientamento predefinito UIImage.Orientation.Up. Puoi inizializzare un MPImage con uno dei valori supportati di UIImage.Orientation. Il riconoscimento gesti non supporta gli orientamenti speculari come .upMirrored, .downMirrored, .leftMirrored e .rightMirrored.

    Per ulteriori informazioni su UIImage, consulta la documentazione per sviluppatori Apple su UIImage.

    CVPixelBuffer

    Il formato CVPixelBuffer è adatto per le applicazioni che generano frame e utilizzano il framework CoreImage di iOS per l'elaborazione.

    Il formato CVPixelBuffer è adatto per le seguenti modalità di esecuzione:

    • Immagini: le app che generano immagini CVPixelBuffer dopo un po' di elaborazione utilizzando il framework CVPixelBuffer di iOS possono essere inviate a Rilevamento gesti in modalità di esecuzione delle immagini.CoreImage

    • Video: i frame video possono essere convertiti in formato CVPixelBuffer per l'elaborazione e poi inviati a Rilevamento dei gesti in modalità video.

    • live streaming: le app che utilizzano una fotocamera iOS per generare frame possono essere convertite in formato CVPixelBuffer per l'elaborazione prima di essere inviate al Riconoscitore di gesti in modalità live streaming.

    Swift

    // Obtain a CVPixelBuffer.
    
    // Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the default
    // orientation `UIImage.Orientation.up`.
    let image = try MPImage(pixelBuffer: pixelBuffer)
        

    Objective-C

    // Obtain a CVPixelBuffer.
    
    // Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the
    // default orientation `UIImageOrientationUp`.
    MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
        

    Per ulteriori informazioni su CVPixelBuffer, consulta la documentazione per sviluppatori Apple di CVPixelBuffer.

    CMSampleBuffer

    Il formato CMSampleBuffer memorizza i sample di media di un tipo uniforme ed è adatto alla modalità di esecuzione del live streaming. I frame in tempo reale delle videocamere iOS vengono caricati in modo asincrono nel formato CMSampleBuffer da AVCaptureVideoDataOutput di iOS.

    Swift

    // Obtain a CMSampleBuffer.
    
    // Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the default
    // orientation `UIImage.Orientation.up`.
    let image = try MPImage(sampleBuffer: sampleBuffer)
        

    Objective-C

    // Obtain a `CMSampleBuffer`.
    
    // Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the
    // default orientation `UIImageOrientationUp`.
    MPImage *image = [[MPPImage alloc] initWithSampleBuffer:sampleBuffer error:nil];
        

    Per ulteriori informazioni su CMSampleBuffer, consulta la documentazione per sviluppatori Apple su CMSampleBuffer.

    Esegui l'attività

    Per eseguire il Riconoscitore di gesti, utilizza il metodo recognize() specifico per la modalità di esecuzione assegnata:

    • Immagine statica: recognize(image:)
    • Video: recognize(videoFrame:timestampInMilliseconds:)
    • Live streaming: recognizeAsync(image:timestampInMilliseconds:)

    I seguenti esempi di codice mostrano esempi di base su come eseguire il Rilevamento dei gesti in queste diverse modalità di esecuzione:

    Swift

    Immagine

    let result = try gestureRecognizer.recognize(image: image)
        

    Video

    let result = try gestureRecognizer.recognize(
      videoFrame: image,
      timestampInMilliseconds: timestamp)
        

    Live streaming

    try gestureRecognizer.recognizeAsync(
      image: image,
      timestampInMilliseconds: timestamp)
        

    Objective-C

    Immagine

      MPPGestureRecognizerResult *result =
        [gestureRecognizer recognizeImage:mppImage
                                    error:nil];
        

    Video

    MPPGestureRecognizerResult *result =
      [gestureRecognizer recognizeVideoFrame:image
                     timestampInMilliseconds:timestamp
                                       error:nil];
        

    Live streaming

    BOOL success =
      [gestureRecognizer recognizeAsyncImage:image
                     timestampInMilliseconds:timestamp
                                       error:nil];
        

    Il codice di esempio consente all'utente di passare da una modalità di elaborazione all'altra, che potrebbe non essere necessaria per il tuo caso d'uso.

    Tieni presente quanto segue:

    • Quando esegui l'attività in modalità video o live streaming, devi anche fornire il timestamp del frame di input all'attività Rilevamento dei gesti.

    • Quando viene eseguita in modalità immagine o video, l'attività Rilevamento gesti blocca il thread corrente fino al termine dell'elaborazione dell'immagine o dell'inquadratura di input. Per evitare di bloccare il thread corrente, esegui l'elaborazione in un thread in background utilizzando i framework iOS Dispatch o NSOperation.

    • Quando viene eseguita in modalità live streaming, l'attività di riconoscimento dei gesti viene restituita immediatamente e non blocca il thread corrente. Dopo aver elaborato ogni frame di input, invoca il metodo gestureRecognizer(_:didFinishRecognition:timestampInMilliseconds:error:) con il risultato del riconoscimento dei gesti. Il Rilevamento Gesti invoca questo metodo in modo asincrono in una coda di invio seriale dedicata. Per visualizzare i risultati nell'interfaccia utente, inviali alla coda principale dopo averli elaborati. Se la funzione recognizeAsync viene chiamata quando l'attività Riconoscimento gesti è impegnata a elaborare un altro frame, il Riconoscimento gesti ignora il nuovo frame di input.

    Gestire e visualizzare i risultati

    Dopo l'esecuzione dell'inferenza, l'attività Riconoscimento gesti restituisce un GestureRecognizerResult contenente i punti di riferimento della mano nelle coordinate dell'immagine, i punti di riferimento della mano nelle coordinate del mondo, la mano(mano sinistra/destra) e le categorie di gesti delle mani rilevate.

    Di seguito è riportato un esempio dei dati di output di questa attività:

    Il risultato GestureRecognizerResult contiene quattro componenti e ogni componente è un array in cui ogni elemento contiene il risultato rilevato di una singola mano rilevata.

    • Mano dominante

      La mano indica se le mani rilevate sono mani sinistra o destra.

    • Gesti

      Le categorie di gesti riconosciute delle mani rilevate.

    • Punti di riferimento

      Esistono 21 punti di riferimento della mano, ciascuno composto da coordinate x, y e z. Le coordinate x e y sono normalizzate in [0,0, 1,0] in base alla larghezza e all'altezza dell'immagine, rispettivamente. La coordinata z rappresenta la profondità del punto di riferimento, dove la profondità al polso è l'origine. Più piccolo è il valore, più il punto di riferimento è vicino alla fotocamera. L'intensità di z utilizza approssimativamente la stessa scala di x.

    • Monumenti del mondo

      I 21 punti di riferimento della mano sono presentati anche in coordinate mondiali. Ogni punto di riferimento è composto da x, y e z e rappresentano le coordinate 3D del mondo reale in metri con l'origine al centro geometrico della mano.

    GestureRecognizerResult:
      Handedness:
        Categories #0:
          index        : 0
          score        : 0.98396
          categoryName : Left
      Gestures:
        Categories #0:
          score        : 0.76893
          categoryName : Thumb_Up
      Landmarks:
        Landmark #0:
          x            : 0.638852
          y            : 0.671197
          z            : -3.41E-7
        Landmark #1:
          x            : 0.634599
          y            : 0.536441
          z            : -0.06984
        ... (21 landmarks for a hand)
      WorldLandmarks:
        Landmark #0:
          x            : 0.067485
          y            : 0.031084
          z            : 0.055223
        Landmark #1:
          x            : 0.063209
          y            : -0.00382
          z            : 0.020920
        ... (21 world landmarks for a hand)
    

    Le seguenti immagini mostrano una visualizzazione dell'output dell'attività: