งานตัวจดจำท่าทางของ MediaPipe ช่วยให้คุณจดจำท่าทางของมือแบบเรียลไทม์ รวมถึงแสดงผลลัพธ์ท่าทางของมือที่จดจำและจุดสังเกตของมือที่ตรวจพบ วิธีการเหล่านี้แสดงวิธีใช้โปรแกรมจดจำท่าทางร่วมกับแอปพลิเคชัน iOS
คุณดูการใช้งานจริงของงานนี้ได้โดยดูการสาธิตการใช้เว็บ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ โมเดล และตัวเลือกการกำหนดค่าของงานนี้ โปรดดูภาพรวม
ตัวอย่างโค้ด
โค้ดตัวอย่างของ MediaPipe Tasks คือการใช้งานพื้นฐานของแอปโปรแกรมจดจำท่าทางสัมผัสสำหรับ iOS ตัวอย่างนี้ใช้กล้องบนอุปกรณ์ iOS จริงเพื่อตรวจจับท่าทางสัมผัสของมืออย่างต่อเนื่อง และยังใช้รูปภาพและวิดีโอจากแกลเลอรีของอุปกรณ์เพื่อตรวจจับท่าทางสัมผัสแบบคงที่ได้ด้วย
คุณสามารถใช้แอปนี้เป็นจุดเริ่มต้นสําหรับแอป iOS ของคุณเอง หรือใช้อ้างอิงเมื่อแก้ไขแอปที่มีอยู่ โค้ดตัวอย่าง Gesture Recognizer โฮสต์อยู่ใน GitHub
ดาวน์โหลดรหัส
วิธีการต่อไปนี้แสดงวิธีสร้างสำเนาโค้ดตัวอย่างในเครื่องโดยใช้เครื่องมือบรรทัดคำสั่ง git
วิธีดาวน์โหลดโค้ดตัวอย่าง
โคลนที่เก็บ Git โดยใช้คำสั่งต่อไปนี้
git clone https://github.com/google-ai-edge/mediapipe-samples
(ไม่บังคับ) กำหนดค่าอินสแตนซ์ 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"] |
|
|
|
custom_gestures_classifier_options |
ตัวเลือกในการกําหนดค่าลักษณะการทํางานของตัวแยกประเภทท่าทางสัมผัสที่กําหนดเอง |
|
|
|
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)
รูปภาพต่อไปนี้แสดงการแสดงภาพเอาต์พุตของงาน