คู่มือการจดจำท่าทางสัมผัสสำหรับ iOS

งานตัวจดจำท่าทางของ MediaPipe ช่วยให้คุณจดจำท่าทางของมือแบบเรียลไทม์ รวมถึงแสดงผลลัพธ์ท่าทางของมือที่จดจำและจุดสังเกตของมือที่ตรวจพบ วิธีการเหล่านี้แสดงวิธีใช้โปรแกรมจดจำท่าทางร่วมกับแอปพลิเคชัน iOS

คุณดูการใช้งานจริงของงานนี้ได้โดยดูการสาธิตการใช้เว็บ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ โมเดล และตัวเลือกการกำหนดค่าของงานนี้ โปรดดูภาพรวม

ตัวอย่างโค้ด

โค้ดตัวอย่างของ MediaPipe Tasks คือการใช้งานพื้นฐานของแอปโปรแกรมจดจำท่าทางสัมผัสสำหรับ iOS ตัวอย่างนี้ใช้กล้องบนอุปกรณ์ iOS จริงเพื่อตรวจจับท่าทางสัมผัสของมืออย่างต่อเนื่อง และยังใช้รูปภาพและวิดีโอจากแกลเลอรีของอุปกรณ์เพื่อตรวจจับท่าทางสัมผัสแบบคงที่ได้ด้วย

คุณสามารถใช้แอปนี้เป็นจุดเริ่มต้นสําหรับแอป iOS ของคุณเอง หรือใช้อ้างอิงเมื่อแก้ไขแอปที่มีอยู่ โค้ดตัวอย่าง Gesture Recognizer โฮสต์อยู่ใน GitHub

ดาวน์โหลดรหัส

วิธีการต่อไปนี้แสดงวิธีสร้างสำเนาโค้ดตัวอย่างในเครื่องโดยใช้เครื่องมือบรรทัดคำสั่ง git

วิธีดาวน์โหลดโค้ดตัวอย่าง

  1. โคลนที่เก็บ Git โดยใช้คำสั่งต่อไปนี้

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. (ไม่บังคับ) กำหนดค่าอินสแตนซ์ git ให้ใช้การตรวจสอบแบบเบาบางเพื่อให้คุณมีไฟล์สำหรับแอปตัวอย่างโปรแกรมจดจำท่าทางสัมผัสเท่านั้น โดยทำดังนี้

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

หลังจากสร้างโค้ดตัวอย่างเวอร์ชันในเครื่องแล้ว คุณจะติดตั้งไลบรารีงาน MediaPipe, เปิดโปรเจ็กต์โดยใช้ Xcode และเรียกใช้แอปได้ ดูวิธีการได้ที่คู่มือการตั้งค่าสำหรับ iOS

คอมโพเนนต์หลัก

ไฟล์ต่อไปนี้มีโค้ดสําคัญสําหรับตัวอย่างแอปพลิเคชันโปรแกรมจดจำท่าทาง

  • GestureRecognizerService.swift: เริ่มต้นการรู้จำท่าทางสัมผัส จัดการการเลือกโมเดล และเรียกใช้การอนุมานเกี่ยวกับข้อมูลอินพุต
  • CameraViewController.swift: ใช้ UI สำหรับฟีดกล้องสดในโหมดอินพุตและแสดงผลลัพธ์เป็นภาพ
  • MediaLibraryViewController.swift: ใช้ UI สำหรับโหมดป้อนข้อมูลไฟล์ภาพนิ่งและวิดีโอแล้วแสดงภาพผลลัพธ์

ตั้งค่า

ส่วนนี้จะอธิบายขั้นตอนสำคัญในการตั้งค่าสภาพแวดล้อมการพัฒนาและโปรเจ็กต์โค้ดเพื่อใช้โปรแกรมจดจำท่าทางสัมผัส ดูข้อมูลทั่วไปเกี่ยวกับการตั้งค่าสภาพแวดล้อมการพัฒนาเพื่อใช้งาน MediaPipe รวมถึงข้อกำหนดเวอร์ชันแพลตฟอร์มได้ที่คู่มือการตั้งค่าสำหรับ iOS

การอ้างอิง

โปรแกรมจดจำท่าทางสัมผัสใช้ไลบรารี MediaPipeTasksVision ซึ่งต้องติดตั้งโดยใช้ CocoaPods ไลบรารีนี้ใช้ได้กับทั้งแอป Swift และ Objective-C และไม่จำเป็นต้องมีการตั้งค่าเพิ่มเติมสำหรับภาษาใดภาษาหนึ่ง

ดูวิธีการติดตั้ง CocoaPods ใน macOS ได้ที่คู่มือการติดตั้ง CocoaPods ดูวิธีการสร้าง Podfile ที่มีพ็อดที่จำเป็นสำหรับแอปได้ที่การใช้ CocoaPods

เพิ่มพ็อด MediaPipeTasksVision ใน Podfile โดยใช้โค้ดต่อไปนี้

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

หากแอปมีเป้าหมายการทดสอบ 1 หน่วย โปรดดูข้อมูลการตั้งค่า Podfile เพิ่มเติมในคู่มือการตั้งค่าสำหรับ iOS

รุ่น

งานโปรแกรมจดจำท่าทางของ MediaPipe ต้องใช้โมเดลที่ผ่านการฝึกอบรมซึ่งเข้ากันได้กับงานนี้ ดูข้อมูลเพิ่มเติมเกี่ยวกับโมเดลที่ผ่านการฝึกแล้วสำหรับโปรแกรมจดจำท่าทางได้ในส่วนภาพรวมของงาน Models

เลือกและดาวน์โหลดโมเดล แล้วเพิ่มลงในไดเรกทอรีโปรเจ็กต์โดยใช้ Xcode โปรดดูวิธีการเพิ่มไฟล์ลงในโปรเจ็กต์ Xcode ได้ที่การจัดการไฟล์และโฟลเดอร์ในโปรเจ็กต์ Xcode ของคุณ

ใช้พร็อพเพอร์ตี้ BaseOptions.modelAssetPath เพื่อระบุเส้นทางไปยังโมเดลใน App Bundle ดูตัวอย่างโค้ดได้ที่ส่วนถัดไป

สร้างงาน

คุณสร้างงาน Gesture Recognizer ได้โดยเรียกตัวเริ่มต้นรายการใดรายการหนึ่ง ตัวเริ่มต้น GestureRecognizer(options:) จะยอมรับค่าสําหรับตัวเลือกการกําหนดค่า

หากไม่จําเป็นต้องเริ่มต้น Gesture Recognizer ด้วยตัวเลือกการกําหนดค่าที่กําหนดเอง คุณสามารถใช้ตัวเริ่มต้น GestureRecognizer(modelPath:) เพื่อสร้าง Gesture Recognizer ด้วยตัวเลือกเริ่มต้น ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกการกำหนดค่าได้ที่ภาพรวมการกำหนดค่า

งานตัวจดจำท่าทางสัมผัสรองรับข้อมูลอินพุต 3 ประเภท ได้แก่ ภาพนิ่ง ไฟล์วิดีโอ และสตรีมวิดีโอสด โดยค่าเริ่มต้น GestureRecognizer(modelPath:) จะเริ่มต้นงานสำหรับภาพนิ่ง หากต้องการให้เริ่มต้นงานเพื่อประมวลผลไฟล์วิดีโอหรือสตรีมวิดีโอสด ให้ใช้ GestureRecognizer(options:) เพื่อระบุโหมดการทำงานของวิดีโอหรือสตรีมแบบสด โหมดสตรีมแบบสดยังต้องใช้ตัวเลือกการกำหนดค่า gestureRecognizerLiveStreamDelegate เพิ่มเติม ซึ่งจะช่วยให้เครื่องมือจดจำท่าทางสัมผัสส่งผลลัพธ์การจดจำท่าทางสัมผัสไปยังผู้รับมอบสิทธิ์แบบไม่เป็นแบบพร้อมกันได้

เลือกแท็บที่สอดคล้องกับโหมดการทํางานเพื่อดูวิธีสร้างงานและเรียกใช้การอนุมาน

Swift

รูปภาพ

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)
    

วิดีโอ

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)
    

ไลฟ์สด

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

รูปภาพ

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

วิดีโอ

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

ไลฟ์สด

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

ตัวเลือกการกำหนดค่า

งานนี้มีตัวเลือกการกำหนดค่าต่อไปนี้สำหรับแอป iOS

ชื่อตัวเลือก คำอธิบาย ช่วงของค่า ค่าเริ่มต้น
runningMode ตั้งค่าโหมดการทำงานสำหรับงาน โดยโหมดมี 3 แบบ ดังนี้

รูปภาพ: โหมดสำหรับอินพุตรูปภาพเดียว

วิดีโอ: โหมดสำหรับเฟรมที่ถอดรหัสของวิดีโอ

LIVE_STREAM: โหมดสตรีมแบบสดของข้อมูลอินพุต เช่น จากกล้อง ในโหมดนี้ คุณต้องเรียกใช้ resultListener เพื่อตั้งค่า Listener เพื่อรับผลลัพธ์แบบไม่สอดคล้อง ในโหมดนี้ ต้องตั้งค่า gestureRecognizerLiveStreamDelegate เป็นอินสแตนซ์ของคลาสที่ใช้ GestureRecognizerLiveStreamDelegate เพื่อรับผลลัพธ์ของการจดจำท่าทางสัมผัสแบบไม่พร้อมกัน
{RunningMode.image, RunningMode.video, RunningMode.liveStream} RunningMode.image
num_hands GestureRecognizer ตรวจจับมือได้จำนวนสูงสุด Any integer > 0 1
min_hand_detection_confidence คะแนนความน่าเชื่อถือขั้นต่ำที่การตรวจจับมือจะถือว่าประสบความสำเร็จในโมเดลการตรวจจับฝ่ามือ 0.0 - 1.0 0.5
min_hand_presence_confidence คะแนนความเชื่อมั่นขั้นต่ำของคะแนนการมีอยู่ของมือในโมเดลการตรวจหาจุดสังเกตของมือ ในโหมดวิดีโอและโหมดสตรีมแบบสดของตัวจดจำท่าทาง หากคะแนนความเชื่อมั่นของมือจากโมเดลจุดสังเกตของมือต่ำกว่าเกณฑ์นี้ ระบบจะเรียกใช้โมเดลการตรวจจับฝ่ามือ มิเช่นนั้นระบบจะใช้อัลกอริทึมการติดตามมือที่มีน้ำหนักเบาเพื่อระบุตำแหน่งมือสำหรับการตรวจหาจุดสังเกตในภายหลัง 0.0 - 1.0 0.5
min_tracking_confidence คะแนนความเชื่อมั่นขั้นต่ำสำหรับการติดตามมือจะถือว่าประสบความสำเร็จ นี่คือเกณฑ์ IoU ของขอบเขตระหว่างมือในเฟรมปัจจุบันกับเฟรมสุดท้าย ในโหมดวิดีโอและโหมดสตรีมของโปรแกรมจดจำท่าทางสัมผัส หากการติดตามไม่สำเร็จ โปรแกรมจดจำท่าทางสัมผัสจะทริกเกอร์การตรวจจับมือ มิฉะนั้น ระบบจะข้ามการตรวจจับมือ 0.0 - 1.0 0.5
canned_gestures_classifier_options ตัวเลือกในการกําหนดค่าลักษณะการทํางานของตัวแยกประเภทท่าทางสัมผัสที่บันทึกไว้ ท่าทางสัมผัสสำเร็จรูปคือ ["None", "Closed_Fist", "Open_Palm", "Pointing_Up", "Thumb_Down", "Thumb_Up", "Victory", "ILoveYou"]
  • ภาษาของชื่อที่แสดง: ภาษาที่จะใช้สำหรับชื่อที่แสดงซึ่งระบุผ่านข้อมูลเมตาของโมเดล TFLite หากมี
  • ผลลัพธ์สูงสุด: จำนวนผลลัพธ์การจัดประเภทที่ได้คะแนนสูงสุดที่จะแสดง หากมีค่าน้อยกว่า 0 ระบบจะแสดงผลลัพธ์ทั้งหมดที่มีอยู่
  • เกณฑ์คะแนน: คะแนนที่ต่ำกว่าเกณฑ์นี้ ระบบจะปฏิเสธผลลัพธ์ หากตั้งค่าเป็น 0 ระบบจะแสดงผลลัพธ์ทั้งหมดที่มีอยู่
  • รายการที่อนุญาตของหมวดหมู่: รายการที่อนุญาตของชื่อหมวดหมู่ หากไม่ว่างเปล่า ระบบจะกรองผลการจัดประเภทที่มีหมวดหมู่ไม่อยู่ในชุดนี้ออก พิเศษร่วมกันกับรายการที่ปฏิเสธ
  • รายการที่ปฏิเสธของหมวดหมู่: รายการที่ปฏิเสธชื่อหมวดหมู่ หากไม่ว่างเปล่า ระบบจะกรองผลการจัดประเภทที่มีหมวดหมู่อยู่ในชุดนี้ออก ใช้ร่วมกันไม่ได้กับรายการที่อนุญาต
    • ภาษาของชื่อที่แสดง: any string
    • ผลการค้นหาสูงสุด: any integer
    • เกณฑ์คะแนน: 0.0-1.0
    • รายการที่อนุญาตของหมวดหมู่: vector of strings
    • รายการที่ปฏิเสธหมวดหมู่: vector of strings
    • ภาษาของชื่อที่แสดง: "en"
    • ผลการค้นหาสูงสุด: -1
    • เกณฑ์คะแนน: 0
    • รายการที่อนุญาตของหมวดหมู่: ว่างเปล่า
    • รายการที่ปฏิเสธหมวดหมู่: ว่าง
    custom_gestures_classifier_options ตัวเลือกในการกําหนดค่าลักษณะการทํางานของตัวแยกประเภทท่าทางสัมผัสที่กําหนดเอง
  • ภาษาของชื่อที่แสดง: ภาษาที่จะใช้สำหรับชื่อที่แสดงซึ่งระบุผ่านข้อมูลเมตาโมเดล TFLite (หากมี)
  • ผลลัพธ์สูงสุด: จำนวนผลลัพธ์การจัดประเภทที่ได้คะแนนสูงสุดที่จะแสดง หากมีค่าน้อยกว่า 0 ระบบจะแสดงผลลัพธ์ทั้งหมดที่มีอยู่
  • เกณฑ์คะแนน: คะแนนที่ต่ำกว่าเกณฑ์นี้ ระบบจะปฏิเสธผลลัพธ์ หากตั้งค่าเป็น 0 ระบบจะแสดงผลลัพธ์ทั้งหมดที่มีอยู่
  • รายการที่อนุญาตของหมวดหมู่: รายการที่อนุญาตของชื่อหมวดหมู่ หากไม่ว่างเปล่า ระบบจะกรองผลการจัดประเภทที่มีหมวดหมู่ไม่อยู่ในชุดนี้ออก พิเศษร่วมกันกับรายการที่ปฏิเสธ
  • รายการที่ปฏิเสธของหมวดหมู่: รายการที่ปฏิเสธชื่อหมวดหมู่ หากไม่ว่างเปล่า ระบบจะกรองผลการจัดประเภทที่มีหมวดหมู่อยู่ในชุดนี้ออก ใช้ร่วมกันไม่ได้กับรายการที่อนุญาต
    • ภาษาของชื่อที่แสดง: any string
    • ผลการค้นหาสูงสุด: any integer
    • เกณฑ์คะแนน: 0.0-1.0
    • รายการที่อนุญาตของหมวดหมู่: vector of strings
    • รายการที่ปฏิเสธหมวดหมู่: vector of strings
    • ภาษาของชื่อที่แสดง: "en"
    • ผลการค้นหาสูงสุด: -1
    • เกณฑ์คะแนน: 0
    • รายการที่อนุญาตของหมวดหมู่: ว่างเปล่า
    • รายการที่ปฏิเสธหมวดหมู่: ว่าง
    result_listener ตั้งค่าโปรแกรมรับฟังผลลัพธ์ให้รับผลการแยกประเภทแบบไม่พร้อมกันเมื่อโปรแกรมจดจำท่าทางอยู่ในโหมดสตรีมแบบสด ใช้ได้เมื่อตั้งค่าโหมดวิ่งเป็น LIVE_STREAM เท่านั้น ResultListener ไม่มี ไม่มี

    เมื่อตั้งค่าโหมดการทํางานเป็น "สตรีมแบบสด" ตัวจดจําท่าทางสัมผัสจะต้องมีตัวเลือกการกําหนดค่า gestureRecognizerLiveStreamDelegate เพิ่มเติม ซึ่งจะช่วยให้ตัวจดจําท่าทางสัมผัสแสดงผลลัพธ์การจดจําท่าทางสัมผัสแบบไม่พร้อมกันได้ โดยผู้รับมอบสิทธิ์ต้องใช้วิธี gestureRecognizer(_:didFinishRecognition:timestampInMilliseconds:error:) ที่ Gesture Recognizer จะเรียกใช้หลังจากประมวลผลผลลัพธ์ของการจดจำท่าทางในแต่ละเฟรม

    ชื่อตัวเลือก คำอธิบาย ช่วงของค่า ค่าเริ่มต้น
    gestureRecognizerLiveStreamDelegate เปิดใช้เพื่อให้โปรแกรมจดจำท่าทางได้รับผลการจดจำท่าทางแบบไม่พร้อมกันในโหมดสตรีมแบบสด คลาสที่มีการตั้งค่าอินสแตนซ์เป็นพร็อพเพอร์ตี้นี้ต้องติดตั้งใช้งานเมธอด gestureRecognizer(_:didFinishRecognition:timestampInMilliseconds:error:) ไม่เกี่ยวข้อง ไม่ได้ตั้งค่า

    เตรียมข้อมูล

    คุณต้องแปลงรูปภาพหรือเฟรมอินพุตเป็นออบเจ็กต์ MPImage ก่อนส่งไปยังโปรแกรมจดจำท่าทาง MPImage รองรับรูปภาพ iOS ประเภทต่างๆ และใช้รูปแบบเหล่านี้ในโหมดการอนุมานใดก็ได้ที่ทำงานอยู่ ดูข้อมูลเพิ่มเติมเกี่ยวกับ MPImage ได้ที่ MPImage API

    เลือกรูปแบบรูปภาพ iOS ตาม Use Case และโหมดการทํางานของแอปพลิเคชันMPImageยอมรับรูปแบบรูปภาพ iOS UIImage, CVPixelBuffer และ CMSampleBuffer

    UIImage

    รูปแบบ UIImage เหมาะสําหรับโหมดการทํางานต่อไปนี้

    • รูปภาพ: รูปภาพจาก App Bundle, แกลเลอรีของผู้ใช้ หรือระบบไฟล์ที่จัดรูปแบบเป็นรูปภาพ UIImage สามารถแปลงเป็นออบเจ็กต์ MPImage ได้

    • วิดีโอ: ใช้ AVAssetImageGenerator เพื่อดึงข้อมูลเฟรมวิดีโอเป็นรูปแบบ CGImage แล้วแปลงเป็นรูปภาพ 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];
        

    ตัวอย่างนี้จะเริ่มต้น MPImage ด้วยการวางแนวเริ่มต้น UIImage.Orientation.Up คุณสามารถเริ่มต้น MPImage ด้วยค่า UIImage.Orientation ที่รองรับค่าใดก็ได้ ตัวจดจำท่าทางสัมผัสไม่รองรับการวางแนวที่สะท้อนกลับ เช่น .upMirrored, .downMirrored, .leftMirrored, .rightMirrored

    ดูข้อมูลเพิ่มเติมเกี่ยวกับ UIImage ได้ที่เอกสารสำหรับนักพัฒนาซอฟต์แวร์ Apple ด้าน UIImage

    CVPixelBuffer

    รูปแบบ CVPixelBuffer เหมาะสําหรับแอปพลิเคชันที่สร้างเฟรมและใช้เฟรมเวิร์ก CoreImage ของ iOS ในการประมวลผล

    รูปแบบ CVPixelBuffer เหมาะสําหรับโหมดการทํางานต่อไปนี้

    • รูปภาพ: แอปที่สร้างรูปภาพ CVPixelBuffer หลังจากการประมวลผลบางอย่างโดยใช้เฟรมเวิร์ก CoreImage ของ iOS สามารถส่งไปยังโปรแกรมจดจำท่าทางสัมผัสในโหมดการเรียกใช้รูปภาพ

    • วิดีโอ: เฟรมวิดีโอสามารถแปลงเป็นรูปแบบ CVPixelBuffer เพื่อประมวลผล จากนั้นส่งไปยังโปรแกรมจดจำท่าทางสัมผัสในโหมดวิดีโอ

    • ไลฟ์สตรีม: แอปที่ใช้กล้อง iOS เพื่อสร้างเฟรมอาจได้รับการแปลงเป็นรูปแบบ CVPixelBuffer เพื่อประมวลผลก่อนที่จะส่งไปยังโปรแกรมจดจำท่าทางสัมผัสในโหมดสตรีมแบบสด

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

    ดูข้อมูลเพิ่มเติมเกี่ยวกับ CVPixelBuffer ได้ที่เอกสารประกอบสำหรับนักพัฒนาแอป CVPixelBuffer ของ Apple

    CMSampleBuffer

    รูปแบบ CMSampleBuffer จะจัดเก็บตัวอย่างสื่อของประเภทสื่อแบบเดียวกัน และเหมาะอย่างยิ่งสำหรับโหมดการทํางานของสตรีมแบบสด เฟรมแบบสดจากกล้อง iOS จะส่งแบบไม่พร้อมกันในรูปแบบ CMSampleBuffer โดย 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)
        

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

    ดูข้อมูลเพิ่มเติมเกี่ยวกับ CMSampleBuffer ได้ในเอกสารประกอบสำหรับนักพัฒนาซอฟต์แวร์ Apple ของ CMSampleBuffer

    เรียกใช้งาน

    หากต้องการเรียกใช้โปรแกรมจดจำท่าทางสัมผัส ให้ใช้เมธอด recognize() สำหรับโหมดการทำงานที่กำหนดโดยเฉพาะ ดังนี้

    • ภาพนิ่ง: recognize(image:)
    • วิดีโอ: recognize(videoFrame:timestampInMilliseconds:)
    • สตรีมสด: recognizeAsync(image:timestampInMilliseconds:)

    ตัวอย่างโค้ดต่อไปนี้แสดงตัวอย่างพื้นฐานของวิธีเรียกใช้โปรแกรมจดจำท่าทางสัมผัสในโหมดการทํางานต่างๆ ต่อไปนี้

    Swift

    รูปภาพ

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

    วิดีโอ

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

    ไลฟ์สด

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

    Objective-C

    รูปภาพ

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

    วิดีโอ

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

    ไลฟ์สด

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

    ตัวอย่างโค้ดนี้ช่วยให้ผู้ใช้สลับระหว่างโหมดการประมวลผลได้ ซึ่งอาจไม่จำเป็นสำหรับกรณีการใช้งานของคุณ

    โปรดทราบดังต่อไปนี้

    • เมื่อทำงานในโหมดวิดีโอหรือโหมดสตรีมแบบสด คุณต้องระบุการประทับเวลาของเฟรมอินพุตให้กับงานตัวจดจำท่าทางด้วย

    • เมื่อทำงานในโหมดรูปภาพหรือวิดีโอ งานตัวจดจำท่าทางสัมผัสจะบล็อกเธรดปัจจุบันจนกว่าจะประมวลผลรูปภาพหรือเฟรมอินพุตเสร็จ หากต้องการหลีกเลี่ยงการบล็อกเทรดปัจจุบัน ให้เรียกใช้การประมวลผลในชุดข้อความเบื้องหลังโดยใช้เฟรมเวิร์ก iOS Dispatch หรือ NSOperation

    • เมื่อทำงานในโหมดสตรีมแบบสด งานโปรแกรมจดจำท่าทางสัมผัสจะแสดงผลทันทีและไม่บล็อกเธรดปัจจุบัน โดยจะเรียกใช้วิธี gestureRecognizer(_:didFinishRecognition:timestampInMilliseconds:error:) ที่มีผลลัพธ์การจดจำท่าทางสัมผัสหลังจากประมวลผลเฟรมอินพุตแต่ละเฟรม ตัวจดจำท่าทางสัมผัสจะเรียกใช้วิธีการนี้แบบไม่พร้อมกันในคิวการจัดส่งอนุกรมเฉพาะ หากต้องการแสดงผลลัพธ์ในอินเทอร์เฟซผู้ใช้ ให้ส่งผลลัพธ์ไปยังคิวหลักหลังจากประมวลผลผลลัพธ์แล้ว หากมีการเรียกใช้ฟังก์ชัน recognizeAsync เมื่องานของโปรแกรมจดจำท่าทางสัมผัสกำลังประมวลผลเฟรมอื่นอยู่ โปรแกรมจดจำท่าทางสัมผัสจะไม่สนใจเฟรมอินพุตใหม่

    จัดการและแสดงผลลัพธ์

    ขณะเรียกใช้การอนุมาน งานการจดจำท่าทางสัมผัสจะแสดงผล GestureRecognizerResult ซึ่งมีจุดสังเกตของมือในพิกัดรูปภาพ จุดสังเกตของมือในพิกัดของโลก มือ(ซ้าย/ขวา) และหมวดหมู่ท่าทางสัมผัสของมือที่ตรวจพบ

    ตัวอย่างต่อไปนี้แสดงตัวอย่างข้อมูลเอาต์พุตจากงานนี้

    GestureRecognizerResult ที่ได้จะมีคอมโพเนนต์ 4 รายการ และแต่ละคอมโพเนนต์จะเป็นอาร์เรย์ โดยแต่ละองค์ประกอบจะมีผลลัพธ์ที่ตรวจพบจากมือที่ตรวจพบ 1 ข้าง

    • ความถนัดของมือ

      ความถนัดของมือแสดงให้เห็นว่ามือที่ตรวจพบเป็นมือซ้ายหรือมือขวา

    • ท่าทางสัมผัส

      หมวดหมู่ท่าทางสัมผัสที่รู้จักของมือที่ตรวจพบ

    • จุดสังเกต

      มีจุดสังเกต 21 จุด แต่ละรายการประกอบด้วยพิกัด x, y และ z ระบบจะปรับพิกัด x และ y เป็น [0.0, 1.0] ตามความกว้างและความสูงของรูปภาพตามลำดับ พิกัด z แสดงถึงระดับความลึกของจุดสังเกต โดยที่ระดับความลึกที่ข้อมือคือจุดเริ่มต้น ยิ่งค่านี้เล็ก สถานที่สำคัญก็จะยิ่งอยู่ใกล้กับกล้อง ขนาดของ z ใช้สเกลใกล้เคียงกับ x

    • สถานที่สำคัญของโลก

      นอกจากนี้ สัญลักษณ์มือ 21 ข้างยังแสดงเป็นพิกัดของโลกด้วย จุดสังเกตแต่ละจุดประกอบด้วย x, y และ z ซึ่งแสดงพิกัด 3 มิติในชีวิตจริงเป็นเมตร โดยจุดเริ่มต้นอยู่ที่จุดศูนย์กลางเชิงเรขาคณิตของมือ

    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)
    

    รูปภาพต่อไปนี้แสดงการแสดงภาพเอาต์พุตของงาน