تتيح لك مهمة معارِض اليد في MediaPipe اكتشاف معالم الأيدي في الصورة. توضِّح لك هذه التعليمات كيفية استخدام ميزة "وضع علامات على أجزاء اليد" مع تطبيقات iOS. يتوفّر نموذج الرمز المبرمَج الموصوف في هذه التعليمات على GitHub.
لمزيد من المعلومات عن الإمكانات والنماذج وخيارات الضبط لهذه المهمة، اطّلِع على نظرة عامة.
مثال على الرمز البرمجي
رمز مثال "مهام MediaPipe" هو تنفيذ أساسي لتطبيق "دليل يدوي" لنظام التشغيل iOS. يستخدم المثال الكاميرا على جهاز iOS لرصد معالم اليد في بث فيديو مستمر. يمكن للتطبيق أيضًا رصد معالم اليد في الصور والفيديوهات من معرض الصور على الجهاز.
يمكنك استخدام التطبيق كنقطة بداية لتطبيق iOS أو الرجوع إليه عند تعديل تطبيق حالي. تتم استضافة نموذج الرمز البرمجي المرتبط بـ Hand المحدَّد على 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/hand_landmarker/ios/
بعد إنشاء نسخة محلية من نموذج الرمز البرمجي، يمكنك تثبيت مكتبة مهام MediaPipe وفتح المشروع باستخدام Xcode وتشغيل التطبيق. للاطّلاع على التعليمات، راجِع دليل الإعداد لنظام التشغيل iOS.
المكونات الرئيسية
تشتمل الملفات التالية على الكود المهم لتطبيق مثال على Hand المحدَّد:
- HandLandmarkerService.swift: تُستخدَم هذه الوظيفة لإعداد علامة Hand Landmarker ومعالجة اختيار النموذج وتنفيذ استنتاج على بيانات الإدخال.
- CameraViewController.swift: لتنفيذ واجهة المستخدم لوضع إدخال خلاصة الكاميرا المباشرة وعرض النتائج.
- MediaLibraryViewController.swift: تنفِّذ واجهة المستخدم لوضع إدخال ملفات الصور الثابتة وملفات الفيديو، و تعرِض النتائج بشكل مرئي.
ضبط إعدادات الجهاز
يصف هذا القسم الخطوات الرئيسية لإعداد بيئة التطوير و مشاريع الرموز البرمجية لاستخدام أداة "وضع علامات على أجزاء اليد". للحصول على معلومات عامة عن إعداد بيئة التطوير لاستخدام مهام MediaPipe، بما في ذلك متطلبات إصدار النظام الأساسي، يمكنك الاطّلاع على دليل الإعداد لنظام التشغيل iOS.
التبعيات
يستخدم Hand Landmarker مكتبة MediaPipeTasksVision
التي يجب تثبيتها
باستخدام CocoaPods. وتتوافق المكتبة مع تطبيقي Swift وObjective-C ولا تتطلب أي إعداد إضافي بلغة محدّدة.
للحصول على تعليمات لتثبيت CocoaPods على نظام التشغيل macOS، يُرجى الرجوع إلى دليل تثبيت CocoaPods
.
للحصول على تعليمات حول كيفية إنشاء Podfile
باستخدام الحِزم اللازمة لتطبيقك، يُرجى الرجوع إلى مقالة استخدام CocoaPods.
أضِف لوحة MediaPipeTasksVision في Podfile
باستخدام الرمز التالي:
target 'MyHandLandmarkerApp' do
use_frameworks!
pod 'MediaPipeTasksVision'
end
إذا كان تطبيقك يتضمّن أهداف اختبار الوحدات، يمكنك الرجوع إلى دليل الإعداد لنظام التشغيل
iOS للحصول على معلومات إضافية عن إعداد
Podfile
.
الطراز
تتطلب مهمة أداة ترميز اليد من MediaPipe نموذجًا مدرّبًا ومتوافقًا مع هذه المهمة. لمزيد من المعلومات عن النماذج المدربة المتاحة لميزة وضع علامات على أجزاء اليد، يمكنك الاطّلاع على القسم نماذج ضمن النظرة العامة على المهمة.
اختَر نموذجًا ونزِّله وأضِفه إلى دليل مشروعك باستخدام Xcode. للحصول على تعليمات حول كيفية إضافة ملفات إلى مشروع Xcode، يُرجى الرجوع إلى مقالة إدارة الملفات والمجلدات في مشروع Xcode.
استخدِم السمة BaseOptions.modelAssetPath
لتحديد مسار الوصول إلى النموذج
في حِزمة تطبيقك. للاطّلاع على مثال على الرمز، يُرجى الاطّلاع على القسم التالي.
إنشاء المهمة
يمكنك إنشاء مهمة "أداة معلم اليد" من خلال استدعاء أحد المهيئات. يقبل مُنشئ
HandLandmarker(options:)
قيمًا لخيارات الضبط
.
إذا لم تكن بحاجة إلى "أداة ترميز يد" تم إعدادها باستخدام خيارات إعداد مخصّصة، يمكنك استخدام "أداة إعداد HandLandmarker(modelPath:)
" لإنشاء "مَعلمة يدوية" باستخدام الخيارات التلقائية. لمزيد من المعلومات حول خيارات الضبط،
يمكنك الاطّلاع على نظرة عامة على الضبط
تتيح مهمة "وضع علامات على أجزاء اليد" استخدام 3 أنواع من بيانات الإدخال: الصور الثابتة وملفات الفيديو
وأحداث البث المباشر للفيديوهات. بشكلٍ تلقائي، يبدأ HandLandmarker(modelPath:)
مهمة
للصور الثابتة. إذا كنت تريد بدء مهمتك لمعالجة ملفات
الفيديو أو أحداث بث الفيديو المباشر، استخدِم HandLandmarker(options:)
لتحديد وضع تشغيل
الفيديو أو البث المباشر. يتطلّب وضع البث المباشر أيضًا خيار ضبط "handLandmarkerLiveStreamDelegate
" الإضافي، الذي يتيح
أداة "مَعلمة يدوية" عرض نتائج "مَعلمة يدوية" إلى المفوَّض بشكل غير متزامن.
اختَر علامة التبويب المناسبة لوضع التشغيل لمعرفة كيفية إنشاء المهمة وتنفيذ الاستنتاج.
Swift
صورة
import MediaPipeTasksVision let modelPath = Bundle.main.path(forResource: "hand_landmarker", ofType: "task") let options = HandLandmarkerOptions() options.baseOptions.modelAssetPath = modelPath options.runningMode = .image options.minHandDetectionConfidence = minHandDetectionConfidence options.minHandPresenceConfidence = minHandPresenceConfidence options.minTrackingConfidence = minHandTrackingConfidence options.numHands = numHands let handLandmarker = try HandLandmarker(options: options)
فيديو
import MediaPipeTasksVision let modelPath = Bundle.main.path(forResource: "hand_landmarker", ofType: "task") let options = HandLandmarkerOptions() options.baseOptions.modelAssetPath = modelPath options.runningMode = .video options.minHandDetectionConfidence = minHandDetectionConfidence options.minHandPresenceConfidence = minHandPresenceConfidence options.minTrackingConfidence = minHandTrackingConfidence options.numHands = numHands let handLandmarker = try HandLandmarker(options: options)
بث مباشر
import MediaPipeTasksVision // Class that conforms to the `HandLandmarkerLiveStreamDelegate` protocol and // implements the method that the hand landmarker calls once it finishes // performing landmarks detection in each input frame. class HandLandmarkerResultProcessor: NSObject, HandLandmarkerLiveStreamDelegate { func handLandmarker( _ handLandmarker: HandLandmarker, didFinishDetection result: HandLandmarkerResult?, timestampInMilliseconds: Int, error: Error?) { // Process the hand landmarker result or errors here. } } let modelPath = Bundle.main.path( forResource: "hand_landmarker", ofType: "task") let options = HandLandmarkerOptions() 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 `handLandmarkerLiveStreamDelegate` // property. let processor = HandLandmarkerResultProcessor() options.handLandmarkerLiveStreamDelegate = processor let handLandmarker = try HandLandmarker(options: options)
Objective-C
صورة
@import MediaPipeTasksVision; NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"hand_landmarker" ofType:@"task"]; MPPHandLandmarkerOptions *options = [[MPPHandLandmarkerOptions alloc] init]; options.baseOptions.modelAssetPath = modelPath; options.runningMode = MPPRunningModeImage; options.minHandDetectionConfidence = minHandDetectionConfidence; options.minHandPresenceConfidence = minHandPresenceConfidence; options.minTrackingConfidence = minHandTrackingConfidence; options.numHands = numHands; MPPHandLandmarker *handLandmarker = [[MPPHandLandmarker alloc] initWithOptions:options error:nil];
فيديو
@import MediaPipeTasksVision; NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"hand_landmarker" ofType:@"task"]; MPPHandLandmarkerOptions *options = [[MPPHandLandmarkerOptions alloc] init]; options.baseOptions.modelAssetPath = modelPath; options.runningMode = MPPRunningModeVideo; options.minHandDetectionConfidence = minHandDetectionConfidence; options.minHandPresenceConfidence = minHandPresenceConfidence; options.minTrackingConfidence = minHandTrackingConfidence; options.numHands = numHands; MPPHandLandmarker *handLandmarker = [[MPPHandLandmarker alloc] initWithOptions:options error:nil];
بث مباشر
@import MediaPipeTasksVision; // Class that conforms to the `MPPHandLandmarkerLiveStreamDelegate` protocol // and implements the method that the hand landmarker calls once it finishes // performing landmarks detection in each input frame. @interface APPHandLandmarkerResultProcessor : NSObject@end @implementation APPHandLandmarkerResultProcessor - (void)handLandmarker:(MPPHandLandmarker *)handLandmarker didFinishDetectionWithResult:(MPPHandLandmarkerResult *)handLandmarkerResult timestampInMilliseconds:(NSInteger)timestampInMilliseconds error:(NSError *)error { // Process the hand landmarker result or errors here. } @end NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"hand_landmarker" ofType:@"task"]; MPPHandLandmarkerOptions *options = [[MPPHandLandmarkerOptions 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 `handLandmarkerLiveStreamDelegate` // property. APPHandLandmarkerResultProcessor *processor = [APPHandLandmarkerResultProcessor new]; options.handLandmarkerLiveStreamDelegate = processor; MPPHandLandmarker *handLandmarker = [[MPPHandLandmarker alloc] initWithOptions:options error:nil];
خيارات الضبط
تتضمّن هذه المهمة خيارات الضبط التالية لتطبيقات iOS:
اسم الخيار | الوصف | نطاق القيمة | القيمة التلقائية |
---|---|---|---|
running_mode |
لضبط وضع التشغيل للمهمة هناك ثلاثة
أوضاع: IMAGE: وضع الإدخالات المكوّنة من صورة واحدة. VIDEO: وضع الإطارات التي تم فك ترميزها في الفيديو LIVE_STREAM: وضع البث المباشر لبيانات الإدخال، مثل الكاميرا. في هذا الوضع، يجب استدعاء resultListener لإعداد مستمع لتلقّي النتائج بشكل غير متزامن. في هذا الوضع، يجب ضبط handLandmarkerLiveStreamDelegate
على مثيل لفئة تنفِّذ HandLandmarkerLiveStreamDelegate لتلقّي نتائج رصد
معالم اليد بشكل غير متزامن.
|
{RunningMode.image, RunningMode.video, RunningMode.liveStream } |
RunningMode.image |
numHands |
الحد الأقصى لعدد الأيدي التي يرصدها "كاشف معالم اليد" | Any integer > 0 |
1 |
minHandDetectionConfidence |
يشير ذلك إلى الحد الأدنى لنتيجة الثقة لرصد اليد نجاحًا في نموذج رصد راحة اليد. | 0.0 - 1.0 |
0.5 |
minHandPresenceConfidence |
الحد الأدنى لنتيجة الثقة لنتيجة توفُّر اليد في نموذج رصد معالم اليد في وضع "الفيديو" ووضع "البث المباشر"، إذا كانت نتيجة الثقة في توفّر اليد من نموذج معالِم اليد أقل من هذا الحدّ الأدنى، يشغِّل "معالِم اليد" نموذج رصد راحة اليد. بخلاف ذلك، تحدِّد خوارزمية تتبُّع اليدين البسيطة موقع اليدين لرصد المعالم اللاحقة. | 0.0 - 1.0 |
0.5 |
minTrackingConfidence |
الحد الأدنى لنتيجة الثقة لكي يتم اعتبار تتبع اليد ناجحًا هذا هو الحدّ الأدنى لمقياس IoU للحدود المربّعة بين اليدين في الإطار الحالي والإطار الأخير. في وضعَي "الفيديو" و"البث" في "وضع تمييز أجزاء اليد"، إذا تعذّر التتبّع، يشغِّل "وضع تمييز أجزاء اليد" ميزة "رصد اليد". في الحالات الأخرى، يتخطّى الجهاز ميزة "رصد اليد". | 0.0 - 1.0 |
0.5 |
result_listener |
ضبط مستمع النتائج لتلقّي نتائج الكشف
بشكل غير متزامن عندما يكون علامة موضع اليد في وضع البث المباشر
لا ينطبق ذلك إلا عند ضبط وضع التشغيل على LIVE_STREAM |
لا ينطبق | لا ينطبق |
عند ضبط وضع التشغيل على "البث المباشر"، يتطلب "أداة وضع علامات على أجزاء اليد" استخدام خيار الضبط handLandmarkerLiveStreamDelegate
الإضافي، والذي يتيح لأداة وضع علامات على أجزاء اليد تقديم نتائج رصد أجزاء اليد بدون التزامن. يجب أن ينفذ المفوَّض handLandmarker(_:didFinishDetection:timestampInMilliseconds:error:)
method،
التي يستدعيها Hand Landmarker بعد معالجة نتائج الكشف عن معالم اليد
لكل إطار.
اسم الخيار | الوصف | نطاق القيمة | القيمة التلقائية |
---|---|---|---|
handLandmarkerLiveStreamDelegate |
يتيح هذا الخيار لتطبيق "وضع علامات على أجزاء اليد" تلقّي نتائج رصد
معالم اليد بشكل غير متزامن في وضع البث المباشر. يجب أن تنفّذ الفئة
التي تم ضبط مثيلها على هذه السمة الأسلوب
handLandmarker(_:didFinishDetection:timestampInMilliseconds:error:) . |
لا تنطبق | لم يتم ضبط الوضع |
تجهيز البيانات
يجب تحويل الصورة أو الإطار المُدخَل إلى كائن MPImage
قبل تمريره إلى "مؤشر اليد". يتيح MPImage
أنواعًا مختلفة من تنسيقات الصور في نظام التشغيل iOS، ويمكنه استخدامها في أي وضع تشغيل للاستنتاج. لمزيد من
المعلومات عن MPImage
، يُرجى الرجوع إلى MPImage API.
اختَر تنسيق صورة لنظام التشغيل iOS استنادًا إلى حالة الاستخدام ووضع التشغيل الذي
يتطلّبه تطبيقك.ويقبل MPImage
تنسيقات الصور UIImage
وCVPixelBuffer
وCMSampleBuffer
على أجهزة iOS.
UIImage
التنسيق UIImage
مناسب تمامًا لأوضاع التشغيل التالية:
الصور: يمكن تحويل الصور من حِزمة تطبيق أو معرض مستخدم أو نظام ملفات بتنسيق
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
، يُرجى الرجوع إلى مستندات "مطوّرو تطبيقات Apple" المتعلقين بـ
CVPixelBuffer.
CMSampleBuffer
يخزّن تنسيق CMSampleBuffer
نماذج وسائط من نوع منتظم، وهو مناسب جدًا لوضع تشغيل البث المباشر. يتم عرض الإطارات المباشرة من كاميرات iOS
بشكل غير متزامن بتنسيق CMSampleBuffer
من خلال
AVCaptureVideoDataOutput على iOS.
Swift
// Obtain a CMSampleBuffer. // Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the default // orientation `UIImage.Orientation.up`. let image = try MPImage(sampleBuffer: sampleBuffer)
Objective-C
// Obtain a `CMSampleBuffer`. // Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the // default orientation `UIImageOrientationUp`. MPImage *image = [[MPPImage alloc] initWithSampleBuffer:sampleBuffer error:nil];
لمزيد من المعلومات حول CMSampleBuffer
، يُرجى الاطّلاع على وثائق مطوّري
برامج Apple CMSampleBuffer.
تنفيذ المهمة
لتشغيل أداة وضع علامات على اليد، استخدِم طريقة detect()
الخاصة بالوضع المخصّص
للعمل:
- صورة ثابتة:
detect(image:)
- الفيديو:
detect(videoFrame:timestampInMilliseconds:)
- بث مباشر:
detectAsync(image:timestampInMilliseconds:)
Swift
صورة
let result = try handLandmarker.detect(image: image)
فيديو
let result = try handLandmarker.detect( videoFrame: image, timestampInMilliseconds: timestamp)
بث مباشر
try handLandmarker.detectAsync( image: image, timestampInMilliseconds: timestamp)
Objective-C
صورة
MPPHandLandmarkerResult *result = [handLandmarker detectInImage:image error:nil];
فيديو
MPPHandLandmarkerResult *result = [handLandmarker detectInVideoFrame:image timestampInMilliseconds:timestamp error:nil];
بث مباشر
BOOL success = [handLandmarker detectAsyncInImage:image timestampInMilliseconds:timestamp error:nil];
يعرض مثال رمز "النقاط المميّزة لليد" عمليات تنفيذ كلّ من هذه الأوضاع بمزيد من التفصيل. يسمح مثال الرمز البرمجي للمستخدم بالتبديل بين معالجة الأوضاع، وقد لا يكون ذلك مطلوبًا لحالة الاستخدام.
يُرجى ملاحظة ما يلي:
عند التشغيل في وضع الفيديو أو وضع البث المباشر، يجب أيضًا تقديم الطابع الزمني لإطار الإدخال إلى مهمة "وضع علامات على أجزاء اليد".
عند التشغيل في وضع الصورة أو الفيديو، تحظر مهمة "وضع علامات على أجزاء اليد" السلسلة الجارية إلى أن تنتهي من معالجة الصورة أو الإطار المُدخل. ولتجنّب حظر سلسلة التعليمات الحالية، يمكنك تنفيذ المعالجة في سلسلة محادثات في الخلفية باستخدام إطار عمل iOSDispatch أو NSOperation.
عند التشغيل في وضع البث المباشر، تُعرض مهمة "وضع علامات على أجزاء اليد" على الفور ولا تحظر سلسلة المحادثات الحالية. ويُستخدَم الأسلوب
handLandmarker(_:didFinishDetection:timestampInMilliseconds:error:)
مع نتيجة علامة موضع اليد بعد معالجة كل إطار إدخال. يستدعي دليل العناصر اليدوية هذه الطريقة بشكل غير متزامن على قائمة انتظار إرسال تسلسلية مخصصة. لعرض النتائج على واجهة المستخدم، أرسِل النتائج إلى "القائمة الرئيسية" بعد معالجة النتائج. إذا تم استدعاء الدالةdetectAsync
عندما تكون مهمة "مُحدِّد معالم اليد" مشغولة في معالجة لقطة أخرى، يتجاهل "مُحدِّد معالم اليد" لقطة الإدخال الجديدة.
معالجة النتائج وعرضها
عند تنفيذ الاستنتاج، تعرض مَهمّة "مَعلمة اليد" HandLandmarkerResult
تحتوي على معالم يدوية في إحداثيات الصورة ومعالم اليد في إحداثيات العالم، ومدى استخدام اليدين(اليد اليسرى أو اليمنى) لليد التي تم رصدها.
في ما يلي مثال على بيانات الإخراج من هذه المهمة:
يحتوي الناتج HandLandmarkerResult
على ثلاثة مكوّنات. كل مكوّن هو صفيف، حيث يحتوي كل عنصر على النتائج التالية ليد واحدة تم رصدها:
استخدام إحدى اليدين
يشير مقياس اليد المفضّلة إلى ما إذا كانت الأيدي التي تم رصدها هي اليد اليمنى أو اليسرى.
المعالم
تظهر 21 مَعلمًا لليد، ويتألف كلّ منها من إحداثيات
x
وy
وz
. يتم توحيد إحداثياتx
وy
لتكون [0.0, 1.0] حسب عرض الصورة وارتفاعها على التوالي. يمثّل الإحداثيz
عمق المَعلم، مع كون العميق في الرسغ هو الأصل. كلما كانت القيمة أصغر، اقترب المعلم من الكاميرا. يستخدم حجمz
المقياس نفسه تقريبًا الذي يستخدمهx
.معالم عالمية
يتم أيضًا عرض المعالم البالغ عددها 21 يدًا في الإحداثيات العالمية. يتألّف كل معلم من
x
وy
وz
، وهي تمثل إحداثيات ثلاثية الأبعاد في العالم الحقيقي بال مترات مع منشأ في المركز الهندسي لليد.
HandLandmarkerResult:
Handedness:
Categories #0:
index : 0
score : 0.98396
categoryName : Left
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)
تعرض الصورة التالية عرضًا مرئيًا لمعدّل تكرار المهمة: