راهنمای تشخیص ژست برای iOS

وظیفه MediaPipe Gesture Recognizer به شما امکان می دهد حرکات دست را در زمان واقعی تشخیص دهید و نتایج تشخیص دست و نشانه های دست را در دست های شناسایی شده ارائه می دهد. این دستورالعمل ها به شما نشان می دهد که چگونه از Gesture Recognizer با برنامه های iOS استفاده کنید.

می‌توانید با مشاهده نسخه نمایشی وب، این کار را در عمل مشاهده کنید. برای اطلاعات بیشتر در مورد قابلیت‌ها، مدل‌ها و گزینه‌های پیکربندی این کار، به نمای کلی مراجعه کنید.

نمونه کد

کد مثال MediaPipe Tasks یک پیاده سازی اساسی از یک برنامه Gesture Recognizer برای iOS است. این مثال از دوربین یک دستگاه فیزیکی iOS برای تشخیص مداوم حرکات دست استفاده می‌کند و همچنین می‌تواند از تصاویر و ویدیوهای گالری دستگاه برای تشخیص استاتیک حرکات استفاده کند.

می‌توانید از برنامه به‌عنوان نقطه شروع برای برنامه iOS خودتان استفاده کنید، یا هنگام تغییر یک برنامه موجود به آن مراجعه کنید. کد نمونه Gesture Recognizer در GitHub میزبانی می شود.

کد را دانلود کنید

دستورالعمل های زیر به شما نشان می دهد که چگونه با استفاده از ابزار خط فرمان git یک کپی محلی از کد مثال ایجاد کنید.

برای دانلود کد نمونه:

  1. با استفاده از دستور زیر مخزن git را کلون کنید:

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. به صورت اختیاری، نمونه git خود را برای استفاده از پرداخت پراکنده پیکربندی کنید، بنابراین فقط فایل‌های برنامه نمونه Gesture Recognizer را داشته باشید:

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

پس از ایجاد یک نسخه محلی از کد نمونه، می توانید کتابخانه وظایف MediaPipe را نصب کنید، پروژه را با استفاده از Xcode باز کنید و برنامه را اجرا کنید. برای دستورالعمل‌ها، به راهنمای راه‌اندازی برای iOS مراجعه کنید.

اجزای کلیدی

فایل های زیر حاوی کد حیاتی برای مثال برنامه Gesture Recognizer هستند:

  • GestureRecognizerService.swift : Gesture Recognizer را راه اندازی می کند، انتخاب مدل را مدیریت می کند و استنتاج را روی داده های ورودی اجرا می کند.
  • CameraViewController.swift : رابط کاربری را برای حالت ورودی تغذیه زنده دوربین پیاده سازی می کند و نتایج را به تصویر می کشد.
  • MediaLibraryViewController.swift : رابط کاربری را برای حالت ورودی تصویر ثابت و فایل ویدیویی پیاده‌سازی می‌کند و نتایج را به‌صورت تصویری نمایش می‌دهد.

برپایی

این بخش مراحل کلیدی را برای راه اندازی محیط توسعه و پروژه های کد برای استفاده از Gesture Recognizer شرح می دهد. برای اطلاعات کلی در مورد تنظیم محیط توسعه خود برای استفاده از وظایف MediaPipe، از جمله الزامات نسخه پلت فرم، به راهنمای راه اندازی برای iOS مراجعه کنید.

وابستگی ها

Gesture Recognizer از کتابخانه MediaPipeTasksVision استفاده می کند که باید با استفاده از CocoaPods نصب شود. این کتابخانه با هر دو برنامه Swift و Objective-C سازگار است و نیازی به تنظیمات زبان خاصی ندارد.

برای دستورالعمل‌های نصب CocoaPods در macOS، به راهنمای نصب CocoaPods مراجعه کنید. برای دستورالعمل‌های نحوه ایجاد یک Podfile با پادهای لازم برای برنامه خود، به استفاده از CocoaPods مراجعه کنید.

با استفاده از کد زیر، MediaPipeTasksVision pod را در Podfile اضافه کنید:

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

اگر برنامه شما شامل اهداف تست واحد است، برای اطلاعات بیشتر در مورد راه‌اندازی Podfile به راهنمای تنظیم برای iOS مراجعه کنید.

مدل

وظیفه MediaPipe Gesture Recognizer به یک مدل آموزش دیده نیاز دارد که با این کار سازگار باشد. برای اطلاعات بیشتر درباره مدل‌های آموزش‌دیده موجود برای Gesture Recognizer، به بخش مدل‌های نمای کلی کار مراجعه کنید.

یک مدل را انتخاب و دانلود کنید و با استفاده از Xcode آن را به فهرست پروژه خود اضافه کنید. برای دستورالعمل‌هایی درباره نحوه افزودن فایل‌ها به پروژه Xcode، به مدیریت فایل‌ها و پوشه‌ها در پروژه Xcode خود مراجعه کنید.

از ویژگی BaseOptions.modelAssetPath برای تعیین مسیر مدل در بسته نرم افزاری خود استفاده کنید. برای مثال کد، بخش بعدی را ببینید.

کار را ایجاد کنید

می‌توانید با فراخوانی یکی از آغازگرهای آن، تکلیف Gesture Recognizer را ایجاد کنید. شروع کننده GestureRecognizer(options:) مقادیری را برای گزینه های پیکربندی می پذیرد.

اگر نیازی به یک Gesture Recognizer راه اندازی شده با گزینه های پیکربندی سفارشی ندارید، می توانید از مقداردهی اولیه GestureRecognizer(modelPath:) برای ایجاد یک Gesture Recognizer با گزینه های پیش فرض استفاده کنید. برای اطلاعات بیشتر درباره گزینه‌های پیکربندی، به نمای کلی پیکربندی مراجعه کنید.

وظیفه تشخیص ژست از 3 نوع داده ورودی پشتیبانی می کند: تصاویر ثابت، فایل های ویدیویی و جریان های ویدیویی زنده. به طور پیش فرض، GestureRecognizer(modelPath:) یک کار را برای تصاویر ثابت مقداردهی اولیه می کند. اگر می‌خواهید وظیفه شما برای پردازش فایل‌های ویدیویی یا پخش جریانی زنده ویدیویی تنظیم شود، از GestureRecognizer(options:) برای تعیین حالت اجرای ویدیو یا پخش زنده استفاده کنید. حالت پخش زنده همچنین به گزینه پیکربندی gestureRecognizerLiveStreamDelegate اضافی نیاز دارد که به Gesture Recognizer امکان می‌دهد تا نتایج تشخیص حرکت را به صورت ناهمزمان به نماینده ارائه دهد.

برای مشاهده نحوه ایجاد کار و اجرای استنتاج، برگه مربوط به حالت در حال اجرا خود را انتخاب کنید.

سریع

تصویر

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)
    

هدف-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 حالت اجرا را برای کار تنظیم می کند. سه حالت وجود دارد:

IMAGE: حالت برای ورودی های تک تصویر.

VIDEO: حالت برای فریم های رمزگشایی شده یک ویدیو.

LIVE_STREAM: حالت پخش زنده داده های ورودی، مانند دوربین. در این حالت، resultListener باید فراخوانی شود تا شنونده ای را برای دریافت نتایج به صورت ناهمزمان تنظیم کند. در این حالت، 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 حداقل امتیاز اطمینان امتیاز حضور دست در مدل تشخیص نقطه عطف دست. در حالت ویدیو و حالت پخش زنده Gesture Recognizer، اگر امتیاز مطمئن حضور دست از مدل نقطه عطف دست کمتر از این آستانه باشد، مدل تشخیص کف دست را فعال می‌کند. در غیر این صورت، یک الگوریتم ردیابی دست سبک وزن برای تعیین محل دست(ها) برای تشخیص نقطه عطف بعدی استفاده می شود. 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 تنظیم شود، همه نتایج موجود برگردانده خواهند شد.
  • فهرست مجاز دسته ها: لیست مجاز نام دسته ها. اگر خالی نباشد، نتایج طبقه‌بندی که دسته آنها در این مجموعه نیست فیلتر می‌شوند. انحصاری متقابل با denylist.
  • Category denylist: فهرست انکار نام دسته ها. در صورت خالی نبودن، نتایج طبقه بندی که دسته آنها در این مجموعه است فیلتر می شود. متقابل منحصر به فرد با لیست مجاز.
    • محل نمایش نام: any string
    • حداکثر نتایج: any integer
    • آستانه امتیاز: 0.0-1.0
    • لیست مجاز دسته: vector of strings
    • Category denylist: vector of strings
    • محل نام های نمایشی: "en"
    • حداکثر نتایج: -1
    • آستانه امتیاز: 0
    • لیست مجاز دسته: خالی
    • فهرست رد رده: خالی
    custom_gestures_classifier_options گزینه هایی برای پیکربندی رفتار طبقه بندی کننده حرکات سفارشی.
  • محل نام‌های نمایشی: محلی برای استفاده برای نام‌های نمایشی مشخص شده از طریق فراداده مدل TFLite، در صورت وجود.
  • حداکثر نتایج: حداکثر تعداد نتایج طبقه بندی با امتیاز بالا برای بازگشت. اگر < 0 باشد، تمام نتایج موجود برگردانده خواهند شد.
  • آستانه امتیاز: امتیازی که زیر آن نتایج رد می شود. اگر روی 0 تنظیم شود، همه نتایج موجود برگردانده خواهند شد.
  • فهرست مجاز دسته ها: لیست مجاز نام دسته ها. اگر خالی نباشد، نتایج طبقه‌بندی که دسته آنها در این مجموعه نیست فیلتر می‌شوند. انحصاری متقابل با denylist.
  • Category denylist: فهرست انکار نام دسته ها. در صورت خالی نبودن، نتایج طبقه بندی که دسته آنها در این مجموعه است فیلتر می شود. متقابل منحصر به فرد با لیست مجاز.
    • محل نمایش نام: any string
    • حداکثر نتایج: any integer
    • آستانه امتیاز: 0.0-1.0
    • لیست مجاز دسته: vector of strings
    • Category denylist: vector of strings
    • محل نام های نمایشی: "en"
    • حداکثر نتایج: -1
    • آستانه امتیاز: 0
    • لیست مجاز دسته: خالی
    • فهرست رد رده: خالی
    result_listener شنونده نتیجه را طوری تنظیم می‌کند که وقتی تشخیص‌دهنده اشاره در حالت پخش زنده است، نتایج طبقه‌بندی را به‌صورت ناهمزمان دریافت کند. فقط زمانی قابل استفاده است که حالت اجرا روی LIVE_STREAM تنظیم شده باشد ResultListener N/A N/A

    هنگامی که حالت اجرا روی پخش زنده تنظیم می شود، Gesture Recognizer به گزینه پیکربندی gestureRecognizerLiveStreamDelegate اضافی نیاز دارد، که به Gesture Recognizer امکان می دهد نتایج تشخیص حرکت را به صورت ناهمزمان ارائه دهد. نماینده باید متد gestureRecognizer(_:didFinishRecognition:timestampInMilliseconds:error:) پیاده سازی کند، که Gesture Recognizer پس از پردازش نتایج انجام تشخیص ژست روی هر فریم فراخوانی می کند.

    نام گزینه شرح محدوده ارزش مقدار پیش فرض
    gestureRecognizerLiveStreamDelegate Gesture Recognizer را فعال می کند تا نتایج تشخیص حرکت را به صورت ناهمزمان در حالت پخش زنده دریافت کند. کلاسی که نمونه آن روی این ویژگی تنظیم شده است باید متد gestureRecognizer(_:didFinishRecognition:timestampInMilliseconds:error:) را پیاده سازی کند. قابل اجرا نیست تنظیم نشده

    داده ها را آماده کنید

    قبل از ارسال آن به Gesture Recognizer باید تصویر یا فریم ورودی را به یک شی MPImage تبدیل کنید. MPImage از انواع فرمت های تصویر iOS پشتیبانی می کند و می تواند از آنها در هر حالت در حال اجرا برای استنتاج استفاده کند. برای اطلاعات بیشتر در مورد MPImage ، به MPImage API مراجعه کنید

    یک قالب تصویر iOS را بر اساس مورد استفاده خود و حالت اجرای مورد نیاز برنامه خود انتخاب کنید. MPImage فرمت‌های تصویر UIImage ، CVPixelBuffer ، و CMSampleBuffer را می‌پذیرد.

    تصویر UII

    فرمت UIImage برای حالت‌های اجرای زیر مناسب است:

    • تصاویر: تصاویر از یک بسته نرم افزاری، گالری کاربر یا سیستم فایل فرمت شده به عنوان تصاویر UIImage را می توان به یک شی MPImage تبدیل کرد.

    • ویدیوها: از AVAssetImageGenerator برای استخراج فریم های ویدیو به فرمت CGImage استفاده کنید، سپس آنها را به تصاویر UIImage تبدیل کنید.

    سریع

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

    هدف-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 پشتیبانی شده مقداردهی کنید. Gesture Recognizer از جهت‌های آینه‌ای مانند .upMirrored ، .downMirrored ، .leftMirrored ، .rightMirrored پشتیبانی نمی‌کند.

    برای اطلاعات بیشتر در مورد UIImage ، به UIImage Apple Developer Documentation مراجعه کنید.

    CVPixelBuffer

    فرمت CVPixelBuffer برای برنامه هایی که فریم تولید می کنند و از چارچوب CoreImage iOS برای پردازش استفاده می کنند، مناسب است.

    فرمت CVPixelBuffer برای حالت‌های اجرای زیر مناسب است:

    • تصاویر: برنامه هایی که تصاویر CVPixelBuffer را پس از مدتی پردازش با استفاده از چارچوب CoreImage iOS تولید می کنند، می توانند در حالت اجرای تصویر به Gesture Recognizer ارسال شوند.

    • فیلم‌ها: فریم‌های ویدیو را می‌توان برای پردازش به فرمت CVPixelBuffer تبدیل کرد و سپس در حالت ویدیو به Gesture Recognizer فرستاد.

    • پخش زنده: برنامه هایی که از دوربین iOS برای تولید فریم استفاده می کنند، ممکن است قبل از ارسال به Gesture Recognizer در حالت پخش زنده، به فرمت CVPixelBuffer برای پردازش تبدیل شوند.

    سریع

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

    هدف-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 مراجعه کنید.

    CMSampleBuffer

    فرمت CMSampleBuffer نمونه‌های رسانه‌ای از یک نوع رسانه یکنواخت را ذخیره می‌کند و برای حالت پخش زنده مناسب است. قاب‌های زنده دوربین‌های iOS به‌صورت ناهمزمان در قالب CMSampleBuffer توسط iOS AVCaptureVideoDataOutput ارائه می‌شوند.

    سریع

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

    هدف-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 مراجعه کنید.

    وظیفه را اجرا کنید

    برای اجرای Gesture Recognizer، از متد recognize() مخصوص حالت در حال اجرا اختصاص داده شده استفاده کنید:

    • تصویر ثابت: recognize(image:)
    • ویدیو: recognize(videoFrame:timestampInMilliseconds:)
    • پخش زنده: recognizeAsync(image:timestampInMilliseconds:)

    نمونه‌های کد زیر نمونه‌های اساسی از نحوه اجرای Gesture Recognizer در این حالت‌های مختلف اجرا را نشان می‌دهند:

    سریع

    تصویر

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

    ویدئو

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

    پخش زنده

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

    هدف-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];
        

    کد مثال به کاربر اجازه می دهد تا بین حالت های پردازشی که ممکن است برای مورد استفاده شما مورد نیاز نباشد جابجا شود.

    به موارد زیر توجه کنید:

    • هنگام اجرا در حالت ویدیو یا حالت پخش زنده، باید مُهر زمانی فریم ورودی را نیز به وظیفه Gesture Recognizer ارائه دهید.

    • هنگامی که در حالت تصویر یا ویدیو اجرا می شود، وظیفه تشخیص حرکت رشته فعلی را مسدود می کند تا زمانی که پردازش تصویر یا فریم ورودی به پایان برسد. برای جلوگیری از مسدود کردن رشته فعلی، پردازش را در یک رشته پس‌زمینه با استفاده از چارچوب‌های iOS Dispatch یا NSOperation انجام دهید.

    • وقتی در حالت پخش زنده اجرا می‌شود، وظیفه تشخیص حرکت فوراً برمی‌گردد و رشته فعلی را مسدود نمی‌کند. پس از پردازش هر فریم ورودی، متد gestureRecognizer(_:didFinishRecognition:timestampInMilliseconds:error:) را با نتیجه تشخیص حرکت فراخوانی می کند. Gesture Recognizer این روش را به صورت ناهمزمان در یک صف پخش سریال اختصاصی فراخوانی می کند. برای نمایش نتایج در رابط کاربری، پس از پردازش نتایج، نتایج را به صف اصلی ارسال کنید. اگر زمانی که وظیفه تشخیص ژست مشغول پردازش فریم دیگری است، recognizeAsync ژست فراخوانی شود، تشخیص دهنده حرکت قاب ورودی جدید را نادیده می گیرد.

    کنترل و نمایش نتایج

    پس از اجرای استنتاج، وظیفه Gesture Recognizer یک GestureRecognizerResult را برمی‌گرداند که شامل نشانه‌های دست در مختصات تصویر، نشانه‌های دست در مختصات جهان، دسته‌بندی دست (چپ/راست)، و حرکات دست در دست‌های شناسایی‌شده است.

    شکل زیر نمونه ای از داده های خروجی از این کار را نشان می دهد:

    GestureRecognizerResult به دست آمده شامل چهار مؤلفه است و هر مؤلفه یک آرایه است که در آن هر عنصر حاوی نتیجه شناسایی شده یک دست شناسایی شده است.

    • دست غالب

      دستی نشان می دهد که دست های شناسایی شده چپ یا راست هستند.

    • حرکات

      دسته های ژست های شناسایی شده دست های شناسایی شده.

    • نقاط دیدنی

      21 نشانه دستی وجود دارد که هر کدام از مختصات x ، y و z تشکیل شده‌اند. مختصات x و y به ترتیب با عرض و ارتفاع تصویر به [0.0، 1.0] نرمال می شوند. مختصات z نشان دهنده عمق نقطه عطف است و عمق مچ دست مبدأ است. هرچه این مقدار کوچکتر باشد، نقطه عطف به دوربین نزدیکتر است. قدر z تقریباً از همان مقیاس x استفاده می کند.

    • نقاط دیدنی جهان

      21 نشانه دستی نیز در مختصات جهانی ارائه شده است. هر نقطه عطفی از x ، y و z تشکیل شده است که مختصات سه بعدی دنیای واقعی را بر حسب متر با مبدأ در مرکز هندسی عقربه نشان می دهد.

    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)
    

    تصاویر زیر تصویری از خروجی کار را نشان می دهد: