Udhëzues për njohjen e gjesteve për iOS

Detyra MediaPipe Gesture Recognizer ju lejon të dalloni gjestet e duarve në kohë reale dhe ofron rezultatet e njohura të gjesteve të duarve dhe pikat referuese të duarve të zbuluara. Këto udhëzime ju tregojnë se si të përdorni Gesture Recognizer me aplikacionet iOS.

Ju mund ta shihni këtë detyrë në veprim duke parë demonstrimin në ueb Për më shumë informacion rreth aftësive, modeleve dhe opsioneve të konfigurimit të kësaj detyre, shihni Përmbledhjen .

Shembull kodi

Kodi i shembullit të MediaPipe Tasks është një zbatim bazë i një aplikacioni Gesture Recognizer për iOS. Shembulli përdor kamerën në një pajisje fizike iOS për të zbuluar vazhdimisht gjestet e duarve dhe gjithashtu mund të përdorë imazhe dhe video nga galeria e pajisjes për të zbuluar në mënyrë statike gjestet.

Mund ta përdorni aplikacionin si pikënisje për aplikacionin tuaj iOS ose t'i referoheni kur modifikoni një aplikacion ekzistues. Shembulli i kodit të Njohësit të Gjestit është i pritur në GitHub .

Shkarkoni kodin

Udhëzimet e mëposhtme ju tregojnë se si të krijoni një kopje lokale të kodit shembull duke përdorur mjetin e linjës së komandës git .

Për të shkarkuar kodin shembull:

  1. Klononi depon e git duke përdorur komandën e mëposhtme:

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Opsionale, konfiguroni shembullin tuaj të git për të përdorur pagesën e rrallë, në mënyrë që të keni vetëm skedarët për shembullin e aplikacionit Gesture Recognizer:

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

Pas krijimit të një versioni lokal të kodit shembull, mund të instaloni bibliotekën e detyrave MediaPipe, të hapni projektin duke përdorur Xcode dhe të ekzekutoni aplikacionin. Për udhëzime, shihni Udhëzuesin e konfigurimit për iOS .

Komponentët kryesorë

Skedarët e mëposhtëm përmbajnë kodin vendimtar për shembullin e aplikacionit Gesture Recognizer:

  • GestureRecognizerService.swift : Inicializon Njohësin e Gjesteve, trajton zgjedhjen e modelit dhe ekzekuton konkluzionet në të dhënat hyrëse.
  • CameraViewController.swift : Zbaton ndërfaqen e përdoruesit për modalitetin e hyrjes së furnizimit të drejtpërdrejtë të kamerës dhe vizualizon rezultatet.
  • MediaLibraryViewController.swift : Zbaton ndërfaqen e përdoruesit për modalitetin e futjes së skedarëve të imazheve dhe videove dhe vizualizon rezultatet.

Konfigurimi

Ky seksion përshkruan hapat kryesorë për konfigurimin e mjedisit tuaj të zhvillimit dhe projekteve të kodit për të përdorur "Njohësin e gjesteve". Për informacion të përgjithshëm mbi konfigurimin e mjedisit tuaj të zhvillimit për përdorimin e detyrave të MediaPipe, duke përfshirë kërkesat e versionit të platformës, shihni udhëzuesin e konfigurimit për iOS .

varësitë

Gesture Recognizer përdor bibliotekën MediaPipeTasksVision , e cila duhet të instalohet duke përdorur CocoaPods. Biblioteka është e pajtueshme me të dy aplikacionet Swift dhe Objective-C dhe nuk kërkon ndonjë konfigurim shtesë specifik për gjuhën.

Për udhëzime për instalimin e CocoaPods në macOS, referojuni udhëzuesit të instalimit të CocoaPods . Për udhëzime se si të krijoni një Podfile me pods-et e nevojshme për aplikacionin tuaj, referojuni Përdorimit të CocoaPods .

Shtoni podin MediaPipeTasksVision në Podfile duke përdorur kodin e mëposhtëm:

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

Nëse aplikacioni juaj përfshin objektiva testimi të njësisë, referojuni Udhëzuesit të konfigurimit për iOS për informacion shtesë mbi konfigurimin e skedarit tuaj Podfile .

Model

Detyra MediaPipe Gesture Recognizer kërkon një model të trajnuar që është në përputhje me këtë detyrë. Për më shumë informacion rreth modeleve të trajnuara të disponueshme për Njohjen e Gjesteve, shihni seksionin Modelet e përmbledhjes së detyrave.

Zgjidhni dhe shkarkoni një model dhe shtoni atë në drejtorinë e projektit tuaj duke përdorur Xcode. Për udhëzime se si të shtoni skedarë në projektin tuaj Xcode, referojuni Menaxhimi i skedarëve dhe dosjeve në projektin tuaj Xcode .

Përdorni veçorinë BaseOptions.modelAssetPath për të specifikuar shtegun drejt modelit në paketën tuaj të aplikacionit. Për një shembull kodi, shihni seksionin tjetër.

Krijo detyrën

Ju mund të krijoni detyrën "Njohësi i gjesteve" duke thirrur një nga inicializuesit e tij. Inicializuesi GestureRecognizer(options:) pranon vlerat për opsionet e konfigurimit.

Nëse nuk keni nevojë për një Njohës Gjestesh të inicializuar me opsione të personalizuara të konfigurimit, mund të përdorni iniciatorin GestureRecognizer(modelPath:) për të krijuar një Njohës Gjestesh me opsionet e paracaktuara. Për më shumë informacion rreth opsioneve të konfigurimit, shihni Përmbledhjen e konfigurimit .

Detyra e Njohjes së Gjesteve mbështet 3 lloje të dhënash hyrëse: imazhe statike, skedarë video dhe transmetime video të drejtpërdrejta. Si parazgjedhje, GestureRecognizer(modelPath:) inicializon një detyrë për imazhet statike. Nëse dëshironi që detyra juaj të inicializohet për të përpunuar skedarë video ose transmetime video të drejtpërdrejta, përdorni GestureRecognizer(options:) për të specifikuar modalitetin e ekzekutimit të videos ose transmetimit të drejtpërdrejtë. Modaliteti i transmetimit të drejtpërdrejtë kërkon gjithashtu opsionin shtesë të konfigurimit të gestureRecognizerLiveStreamDelegate , i cili i mundëson Njohësit të gjesteve t'i japë delegatit rezultatet e njohjes së gjesteve në mënyrë asinkrone.

Zgjidhni skedën që korrespondon me modalitetin tuaj të ekzekutimit për të parë se si të krijoni detyrën dhe të ekzekutoni konkluzionet.

Swift

Imazhi

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)
    

Transmetim i drejtpërdrejtë

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)
    

Objektivi-C

Imazhi

@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];
    

Transmetim i drejtpërdrejtë

@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];
    

Opsionet e konfigurimit

Kjo detyrë ka opsionet e mëposhtme të konfigurimit për aplikacionet iOS:

Emri i opsionit Përshkrimi Gama e vlerave Vlera e paracaktuar
runningMode Vendos modalitetin e ekzekutimit për detyrën. Ekzistojnë tre mënyra:

IMAGE: Modaliteti për hyrjet e një imazhi të vetëm.

VIDEO: Modaliteti për kornizat e dekoduara të një videoje.

LIVE_STREAM: Modaliteti për një transmetim të drejtpërdrejtë të të dhënave hyrëse, si p.sh. nga një aparat fotografik. Në këtë modalitet, resultListener duhet të thirret për të vendosur një dëgjues për të marrë rezultatet në mënyrë asinkrone. Në këtë modalitet, gestureRecognizerLiveStreamDelegate duhet të vendoset në një shembull të një klase që zbaton GestureRecognizerLiveStreamDelegate për të marrë rezultatet e kryerjes së njohjes së gjesteve në mënyrë asinkrone.
{ RunningMode.image, RunningMode.video, RunningMode.liveStream } RunningMode.image
num_hands Numri maksimal i duarve mund të zbulohet nga GestureRecognizer . Any integer > 0 1
min_hand_detection_confidence Rezultati minimal i besimit për zbulimin e dorës për t'u konsideruar i suksesshëm në modelin e zbulimit të pëllëmbës. 0.0 - 1.0 0.5
min_hand_presence_confidence Rezultati minimal i besimit të rezultatit të pranisë së dorës në modelin e zbulimit të pikës referimi me dorë. Në modalitetin "Video" dhe "Transmetimi i drejtpërdrejtë" i "Njohjes së gjesteve", nëse rezultati i sigurt i pranisë së dorës nga modeli i pikës së dorës është nën këtë prag, ai aktivizon modelin e zbulimit të pëllëmbës. Përndryshe, një algoritëm i lehtë i gjurmimit të dorës përdoret për të përcaktuar vendndodhjen e dorës(ave) për zbulimin e mëvonshëm të pikës referimi. 0.0 - 1.0 0.5
min_tracking_confidence Rezultati minimal i besimit që gjurmimi i dorës të konsiderohet i suksesshëm. Ky është pragu kufizues IoU i kutisë midis duarve në kuadrin aktual dhe kuadrit të fundit. Në modalitetin "Video" dhe "Transmetim" të "Njohësit të gjesteve", nëse gjurmimi dështon, "Njohja e gjesteve" aktivizon zbulimin me dorë. Përndryshe, zbulimi i dorës anashkalohet. 0.0 - 1.0 0.5
canned_gestures_classifier_options Opsionet për konfigurimin e sjelljes së klasifikuesit të gjesteve të konservuara. Gjestet e konservuara janë ["None", "Closed_Fist", "Open_Palm", "Pointing_Up", "Thumb_Down", "Thumb_Up", "Victory", "ILoveYou"]
  • Vendndodhja e emrave të shfaqur: vendndodhja për t'u përdorur për emrat e shfaqur të specifikuar përmes Metadatës së Modelit TFLite, nëse ka.
  • Rezultatet maksimale: numri maksimal i rezultateve të klasifikimit me pikët më të larta për t'u kthyer. Nëse < 0, të gjitha rezultatet e disponueshme do të kthehen.
  • Pragu i rezultatit: rezultati nën të cilin rezultatet refuzohen. Nëse vendoset në 0, të gjitha rezultatet e disponueshme do të kthehen.
  • Lista e lejeve të kategorive: lista e lejeve të emrave të kategorive. Nëse nuk janë bosh, rezultatet e klasifikimit kategoria e të cilave nuk është në këtë grup do të filtrohen. Reciprokisht ekskluzive me denylist.
  • Refuzimi i kategorive: lista mohuese e emrave të kategorive. Nëse nuk janë bosh, rezultatet e klasifikimit kategoria e të cilave është në këtë grup do të filtrohen. Reciprokisht ekskluzive me listën e lejeve.
    • Vendndodhja e emrave të shfaqur: any string
    • Rezultatet maksimale: any integer
    • Pragu i rezultatit: 0.0-1.0
    • Lista e lejeve të kategorisë: vector of strings
    • Mohues i kategorisë: vector of strings
    • Vendndodhja e emrave të shfaqur: "en"
    • Rezultatet maksimale: -1
    • Pragu i rezultatit: 0
    • Lista e lejeve të kategorisë: bosh
    • Refuzues i kategorisë: bosh
    custom_gestures_classifier_options Opsionet për konfigurimin e sjelljes së klasifikuesit të gjesteve të personalizuara.
  • Vendndodhja e emrave të shfaqur: vendndodhja për t'u përdorur për emrat e shfaqur të specifikuar përmes Metadatës së Modelit TFLite, nëse ka.
  • Rezultatet maksimale: numri maksimal i rezultateve të klasifikimit me pikët më të larta për t'u kthyer. Nëse < 0, të gjitha rezultatet e disponueshme do të kthehen.
  • Pragu i rezultatit: rezultati nën të cilin rezultatet refuzohen. Nëse vendoset në 0, të gjitha rezultatet e disponueshme do të kthehen.
  • Lista e lejeve të kategorive: lista e lejeve të emrave të kategorive. Nëse nuk janë bosh, rezultatet e klasifikimit kategoria e të cilave nuk është në këtë grup do të filtrohen. Reciprokisht ekskluzive me denylist.
  • Refuzimi i kategorive: lista mohuese e emrave të kategorive. Nëse nuk janë bosh, rezultatet e klasifikimit kategoria e të cilave është në këtë grup do të filtrohen. Reciprokisht ekskluzive me listën e lejeve.
    • Vendndodhja e emrave të shfaqur: any string
    • Rezultatet maksimale: any integer
    • Pragu i rezultatit: 0.0-1.0
    • Lista e lejeve të kategorisë: vector of strings
    • Mohues i kategorisë: vector of strings
    • Vendndodhja e emrave të shfaqur: "en"
    • Rezultatet maksimale: -1
    • Pragu i rezultatit: 0
    • Lista e lejeve të kategorisë: bosh
    • Refuzues i kategorisë: bosh
    result_listener Vendos dëgjuesin e rezultateve që të marrë rezultatet e klasifikimit në mënyrë asinkrone kur njohësi i gjesteve është në modalitetin e transmetimit të drejtpërdrejtë. Mund të përdoret vetëm kur modaliteti i ekzekutimit është caktuar në LIVE_STREAM ResultListener N/A N/A

    Kur modaliteti i ekzekutimit caktohet në transmetim të drejtpërdrejtë, "Njohësi i gjesteve" kërkon opsionin shtesë të konfigurimit të gestureRecognizerLiveStreamDelegate , i cili i mundëson Njohësit të gjesteve të japë rezultatet e njohjes së gjesteve në mënyrë asinkrone. I deleguari duhet të zbatojë metodën gestureRecognizer(_:didFinishRecognition:timestampInMilliseconds:error:) , të cilën Njohësi i gjesteve e quan pas përpunimit të rezultateve të kryerjes së njohjes së gjesteve në çdo kornizë.

    Emri i opsionit Përshkrimi Gama e vlerave Vlera e paracaktuar
    gestureRecognizerLiveStreamDelegate Aktivizon Gesture Recognizer të marrë rezultatet e njohjes së gjesteve në mënyrë asinkrone në modalitetin e transmetimit të drejtpërdrejtë. Klasa, instanca e së cilës është caktuar në këtë veti, duhet të zbatojë metodën gestureRecognizer(_:didFinishRecognition:timestampInMilliseconds:error:) . E pazbatueshme Nuk është vendosur

    Përgatitni të dhënat

    Ju duhet të konvertoni imazhin ose kornizën hyrëse në një objekt MPImage përpara se t'ia kaloni atë te Njohësi i Gjesteve. MPImage mbështet lloje të ndryshme të formateve të imazhit iOS dhe mund t'i përdorë ato në çdo modalitet ekzekutimi për përfundime. Për më shumë informacion rreth MPImage , referojuni MPImage API .

    Zgjidhni një format imazhi iOS bazuar në rastin tuaj të përdorimit dhe mënyrën e ekzekutimit që kërkon aplikacioni juaj. MPImage pranon formatet e imazhit UIImage , CVPixelBuffer dhe CMSampleBuffer iOS.

    UIIimazh

    Formati UIImage është i përshtatshëm për mënyrat e mëposhtme të funksionimit:

    • Imazhet: imazhet nga një grup aplikacioni, galeri përdoruesish ose sistem skedarësh të formatuar si imazhe UIImage mund të konvertohen në një objekt MPImage .

    • Videot: përdorni AVAssetImageGenerator për të nxjerrë kornizat e videos në formatin CGImage , më pas i konvertoni ato në imazhe 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)
        

    Objektivi-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];
        

    Shembulli inicializon një MPImage me orientimin e paracaktuar UIImage.Orientation.Up . Mund të inicializoni një MPImage me ndonjë nga vlerat e mbështetura të UIImage.Orientation . Njohësi i gjesteve nuk mbështet orientime të pasqyruara si .upMirrored , .downMirrored , .leftMirrored , .rightMirrored .

    Për më shumë informacion rreth UIImage , referojuni Dokumentacionit të Zhvilluesit të UIImage Apple .

    CVPixelBuffer

    Formati CVPixelBuffer është i përshtatshëm për aplikacionet që gjenerojnë korniza dhe përdorin kornizën iOS CoreImage për përpunim.

    Formati CVPixelBuffer është i përshtatshëm për mënyrat e mëposhtme të funksionimit:

    • Imazhet: aplikacionet që gjenerojnë imazhe CVPixelBuffer pas disa përpunimit duke përdorur kornizën CoreImage të iOS mund të dërgohen te "Njohësi i gjesteve" në modalitetin e ekzekutimit të imazhit.

    • Videot: kornizat e videos mund të konvertohen në formatin CVPixelBuffer për përpunim dhe më pas të dërgohen te Njohësi i Gjesteve në modalitetin e videos.

    • transmetim i drejtpërdrejtë: aplikacionet që përdorin një kamerë iOS për të gjeneruar korniza mund të konvertohen në formatin CVPixelBuffer për përpunim përpara se të dërgohen te "Njohësi i gjesteve" në modalitetin e transmetimit të drejtpërdrejtë.

    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)
        

    Objektivi-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];
        

    Për më shumë informacion rreth CVPixelBuffer , referojuni Dokumentacionit të Zhvilluesit të Apple CVPixelBuffer .

    CMSampleBuffer

    Formati CMSampleBuffer ruan mostrat e mediave të një lloji uniform të medias dhe është i përshtatshëm për modalitetin e ekzekutimit të transmetimit të drejtpërdrejtë. Kornizat e drejtpërdrejta nga kamerat iOS shpërndahen në mënyrë asinkrone në formatin CMSampleBuffer nga iOS AVCaptureVideoDataOutput .

    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)
        

    Objektivi-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];
        

    Për më shumë informacion rreth CMSampleBuffer , referojuni Dokumentacionit të Zhvilluesit të Apple CMSampleBuffer .

    Drejtoni detyrën

    Për të ekzekutuar "Njohësin e gjesteve", përdorni metodën recognize() specifike për modalitetin e caktuar të funksionimit:

    • Imazhi i palëvizshëm: recognize(image:)
    • Video: recognize(videoFrame:timestampInMilliseconds:)
    • Transmetimi i drejtpërdrejtë: recognizeAsync(image:timestampInMilliseconds:)

    Shembujt e mëposhtëm të kodit tregojnë shembuj bazë se si të ekzekutohet Njohësi i Gjesteve në këto mënyra të ndryshme funksionimi:

    Swift

    Imazhi

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

    Video

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

    Transmetim i drejtpërdrejtë

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

    Objektivi-C

    Imazhi

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

    Video

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

    Transmetim i drejtpërdrejtë

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

    Kodi shembull i lejon përdoruesit të kalojë ndërmjet mënyrave të përpunimit që mund të mos kërkohen për rastin tuaj të përdorimit.

    Vini re sa vijon:

    • Kur ekzekutoni në modalitetin e videos ose në modalitetin e transmetimit të drejtpërdrejtë, duhet të jepni gjithashtu vulën kohore të kornizës së hyrjes në detyrën "Njohësi i gjesteve".

    • Kur funksionon në modalitetin e imazhit ose të videos, detyra e Njohjes së Gjesteve bllokon fillin aktual derisa të përfundojë përpunimin e imazhit ose kornizës hyrëse. Për të shmangur bllokimin e fillit aktual, ekzekutoni përpunimin në një fill në sfond duke përdorur kornizat iOS Dispatch ose NSOoperation .

    • Kur ekzekutohet në modalitetin e transmetimit të drejtpërdrejtë, detyra e "Njohjes së gjesteve" kthehet menjëherë dhe nuk e bllokon lidhjen aktuale. Ai thërret metodën gestureRecognizer(_:didFinishRecognition:timestampInMilliseconds:error:) me rezultatin e njohjes së gjesteve pas përpunimit të çdo kornize hyrëse. Njohësi i gjesteve e thërret këtë metodë në mënyrë asinkrone në një radhë të dedikuar dërgimi serik. Për shfaqjen e rezultateve në ndërfaqen e përdoruesit, dërgoni rezultatet në radhën kryesore pas përpunimit të rezultateve. Nëse funksioni recognizeAsync thirret kur detyra e Njohjes së Gjesteve është e zënë me përpunimin e një kuadri tjetër, Njohësi i Gjestit injoron kornizën e re të hyrjes.

    Trajtoni dhe shfaqni rezultatet

    Pas ekzekutimit të konkluzionit, detyra e Njohësit të Gjestit kthen një GestureRecognizerResult i cili përmban pika referimi të dorës në koordinatat e imazhit, pikat referuese të dorës në koordinatat botërore, kategoritë e duarve (majtas/djathtas) dhe gjestet e duarve të duarve të zbuluara.

    Më poshtë tregon një shembull të të dhënave dalëse nga kjo detyrë:

    Rezultati i GestureRecognizerResult përmban katër komponentë, dhe secili komponent është një grup, ku secili element përmban rezultatin e zbuluar të një dore të vetme të zbuluar.

    • Duartësia

      Duartësia përfaqëson nëse duart e zbuluara janë duart e majta apo të djathta.

    • Gjestet

      Kategoritë e njohura të gjesteve të duarve të zbuluara.

    • Pikat e referimit

      Ka 21 pika referimi, secila e përbërë nga koordinatat x , y dhe z . Koordinatat x dhe y normalizohen në [0.0, 1.0] nga gjerësia dhe lartësia e imazhit, respektivisht. Koordinata z përfaqëson thellësinë e pikës referuese, me thellësinë në kyçin e dorës që është origjina. Sa më e vogël të jetë vlera, aq më afër kamerës është pikë referimi. Madhësia e z përdor përafërsisht të njëjtën shkallë si x .

    • Monumentet e botës

      21 pikat referuese të dorës janë paraqitur gjithashtu në koordinatat botërore. Çdo pikë referimi përbëhet nga x , y dhe z , që përfaqësojnë koordinatat 3D të botës reale në metra me origjinën në qendrën gjeometrike të dorës.

    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)
    

    Imazhet e mëposhtme tregojnë një vizualizim të daljes së detyrës:

    Një dorë në një lëvizje gishti lart me strukturën skeletore të dorës të shënuar