يمكنك استخدام ML Kit للتعرّف على النص في الصور أو الفيديوهات، مثل نص لافتة شارع. في ما يلي الخصائص الرئيسية لهذه الميزة:
الإصدار 2 من Text Recognition API | |
---|---|
الوصف | التعرّف على النص في الصور أو الفيديوهات، مع إتاحة الكتابة باللغات اللاتينية والصينية والديفاناغارية واليابانية والكورية، بالإضافة إلى مجموعة كبيرة من اللغات |
أسماء حِزم تطوير البرامج (SDK) | GoogleMLKit/TextRecognition |
التنفيذ | يتم ربط مواد العرض بتطبيقك بشكل ثابت في وقت الإنشاء |
تأثير حجم التطبيق | حوالي 38 ميغابايت لكل حزمة SDK للبرامج النصية |
الأداء | في الوقت الفعلي على معظم الأجهزة التي تستخدم حزمة SDK للغات اللاتينية، وأبطأ على الأجهزة الأخرى |
جرّبه الآن
- يمكنك تجربة التطبيق النموذجي للاطّلاع على مثال على كيفية استخدام واجهة برمجة التطبيقات هذه.
- يمكنك تجربة الرمز بنفسك من خلال الدرس التطبيقي حول الترميز.
قبل البدء
- أدرِج مجموعات ML Kit التالية في ملف Podfile:
# To recognize Latin script pod 'GoogleMLKit/TextRecognition', '8.0.0' # To recognize Chinese script pod 'GoogleMLKit/TextRecognitionChinese', '8.0.0' # To recognize Devanagari script pod 'GoogleMLKit/TextRecognitionDevanagari', '8.0.0' # To recognize Japanese script pod 'GoogleMLKit/TextRecognitionJapanese', '8.0.0' # To recognize Korean script pod 'GoogleMLKit/TextRecognitionKorean', '8.0.0'
- بعد تثبيت أو تعديل Pods في مشروعك، افتح مشروع Xcode باستخدام
.xcworkspace
. تتوافق حزمة ML Kit مع الإصدار 12.4 من Xcode أو الإصدارات الأحدث.
1. إنشاء مثيل من TextRecognizer
أنشئ مثيلاً من TextRecognizer
عن طريق استدعاء
+textRecognizer(options:)
، مع تمرير الخيارات ذات الصلة بحزمة تطوير البرامج (SDK) التي حدّدتها على أنّها
عنصر تابع على النحو التالي:
Swift
// When using Latin script recognition SDK let latinOptions = TextRecognizerOptions() let latinTextRecognizer = TextRecognizer.textRecognizer(options:options) // When using Chinese script recognition SDK let chineseOptions = ChineseTextRecognizerOptions() let chineseTextRecognizer = TextRecognizer.textRecognizer(options:options) // When using Devanagari script recognition SDK let devanagariOptions = DevanagariTextRecognizerOptions() let devanagariTextRecognizer = TextRecognizer.textRecognizer(options:options) // When using Japanese script recognition SDK let japaneseOptions = JapaneseTextRecognizerOptions() let japaneseTextRecognizer = TextRecognizer.textRecognizer(options:options) // When using Korean script recognition SDK let koreanOptions = KoreanTextRecognizerOptions() let koreanTextRecognizer = TextRecognizer.textRecognizer(options:options)
Objective-C
// When using Latin script recognition SDK MLKTextRecognizerOptions *latinOptions = [[MLKTextRecognizerOptions alloc] init]; MLKTextRecognizer *latinTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options]; // When using Chinese script recognition SDK MLKChineseTextRecognizerOptions *chineseOptions = [[MLKChineseTextRecognizerOptions alloc] init]; MLKTextRecognizer *chineseTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options]; // When using Devanagari script recognition SDK MLKDevanagariTextRecognizerOptions *devanagariOptions = [[MLKDevanagariTextRecognizerOptions alloc] init]; MLKTextRecognizer *devanagariTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options]; // When using Japanese script recognition SDK MLKJapaneseTextRecognizerOptions *japaneseOptions = [[MLKJapaneseTextRecognizerOptions alloc] init]; MLKTextRecognizer *japaneseTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options]; // When using Korean script recognition SDK MLKKoreanTextRecognizerOptions *koreanOptions = [[MLKKoreanTextRecognizerOptions alloc] init]; MLKTextRecognizer *koreanTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options];
2. إعداد الصورة المصدر
مرِّر الصورة كـUIImage
أو CMSampleBufferRef
إلى طريقة process(_:completion:)
في TextRecognizer
:
أنشئ عنصر VisionImage
باستخدام UIImage
أو CMSampleBuffer
.
إذا كنت تستخدم UIImage
، اتّبِع الخطوات التالية:
- أنشئ عنصر
VisionImage
باستخدامUIImage
. احرص على تحديد.orientation
الصحيح.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
إذا كنت تستخدم CMSampleBuffer
، اتّبِع الخطوات التالية:
-
حدِّد اتجاه بيانات الصورة الواردة في
CMSampleBuffer
.للحصول على اتجاه الصورة، اتّبِع الخطوات التالية:
Swift
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> UIImage.Orientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftMirrored : .right case .landscapeLeft: return cameraPosition == .front ? .downMirrored : .up case .portraitUpsideDown: return cameraPosition == .front ? .rightMirrored : .left case .landscapeRight: return cameraPosition == .front ? .upMirrored : .down case .faceDown, .faceUp, .unknown: return .up } }
Objective-C
- (UIImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationLeftMirrored : UIImageOrientationRight; case UIDeviceOrientationLandscapeLeft: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationDownMirrored : UIImageOrientationUp; case UIDeviceOrientationPortraitUpsideDown: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationRightMirrored : UIImageOrientationLeft; case UIDeviceOrientationLandscapeRight: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationUpMirrored : UIImageOrientationDown; case UIDeviceOrientationUnknown: case UIDeviceOrientationFaceUp: case UIDeviceOrientationFaceDown: return UIImageOrientationUp; } }
- أنشئ كائن
VisionImage
باستخدام الكائنCMSampleBuffer
والاتجاه:Swift
let image = VisionImage(buffer: sampleBuffer) image.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition)
Objective-C
MLKVisionImage *image = [[MLKVisionImage alloc] initWithBuffer:sampleBuffer]; image.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
3- معالجة الصورة
بعد ذلك، مرِّر الصورة إلى طريقة process(_:completion:)
:
Swift
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // Error handling return } // Recognized text }
Objective-C
[textRecognizer processImage:image completion:^(MLKText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // Error handling return; } // Recognized text }];
4. استخراج النص من كتل النص التي تم التعرّف عليها
في حال نجاح عملية التعرّف على النص، يتم عرض عنصر Text
. يحتوي عنصر Text
على النص الكامل
الذي تم التعرّف عليه في الصورة، بالإضافة إلى صفر أو أكثر من عناصر TextBlock
.
يمثّل كل TextBlock
مستطيلاً نصيًا يحتوي على صفر أو أكثر من كائنات TextLine
. يحتوي كل عنصر TextLine
على صفر أو أكثر من عناصر TextElement
،
التي تمثّل كلمات وكيانات شبيهة بالكلمات، مثل التواريخ والأرقام.
بالنسبة إلى كل عنصر TextBlock
وTextLine
وTextElement
، يمكنك الحصول على النص الذي تم التعرّف عليه في المنطقة وإحداثيات حدود المنطقة.
على سبيل المثال:
Swift
let resultText = result.text for block in result.blocks { let blockText = block.text let blockLanguages = block.recognizedLanguages let blockCornerPoints = block.cornerPoints let blockFrame = block.frame for line in block.lines { let lineText = line.text let lineLanguages = line.recognizedLanguages let lineCornerPoints = line.cornerPoints let lineFrame = line.frame for element in line.elements { let elementText = element.text let elementCornerPoints = element.cornerPoints let elementFrame = element.frame } } }
Objective-C
NSString *resultText = result.text; for (MLKTextBlock *block in result.blocks) { NSString *blockText = block.text; NSArray<MLKTextRecognizedLanguage *> *blockLanguages = block.recognizedLanguages; NSArray<NSValue *> *blockCornerPoints = block.cornerPoints; CGRect blockFrame = block.frame; for (MLKTextLine *line in block.lines) { NSString *lineText = line.text; NSArray<MLKTextRecognizedLanguage *> *lineLanguages = line.recognizedLanguages; NSArray<NSValue *> *lineCornerPoints = line.cornerPoints; CGRect lineFrame = line.frame; for (MLKTextElement *element in line.elements) { NSString *elementText = element.text; NSArray<NSValue *> *elementCornerPoints = element.cornerPoints; CGRect elementFrame = element.frame; } } }
إرشادات حول الصورة المدخَلة
-
لكي يتعرّف ML Kit على النص بدقة، يجب أن تحتوي الصور المدخلة على نص يمثّله عدد كافٍ من وحدات البكسل. من المفترض أن يكون حجم كل حرف 16×16 بكسل على الأقل. بشكل عام، لا يؤدي تكبير حجم الأحرف إلى أكثر من 24×24 بكسل إلى تحسين الدقة.
على سبيل المثال، قد تكون صورة بحجم 640x480 مناسبة لمسح بطاقة عمل ضوئيًا تشغل العرض الكامل للصورة. لمسح مستند ضوئيًا مطبوع على ورق بحجم الرسالة، قد تحتاج إلى صورة بحجم 720x1280 بكسل.
-
يمكن أن يؤثر التركيز الضعيف للصورة في دقة التعرّف على النص. إذا لم تحصل على نتائج مقبولة، اطلب من المستخدم إعادة التقاط الصورة.
-
إذا كنت تتعرّف على نص في تطبيق يعمل في الوقت الفعلي، عليك مراعاة الأبعاد الإجمالية لصور الإدخال. يمكن معالجة الصور الأصغر حجمًا بشكل أسرع. للحدّ من وقت الاستجابة، احرص على أن يشغل النص أكبر قدر ممكن من الصورة، والتقط الصور بدقة أقل (مع مراعاة متطلبات الدقة المذكورة أعلاه). لمزيد من المعلومات، يُرجى الاطّلاع على نصائح لتحسين الأداء.
نصائح لتحسين الأداء
- لمعالجة لقطات الفيديو، استخدِم
results(in:)
واجهة برمجة التطبيقات المتزامنة الخاصة بأداة الرصد. استدعِ هذه الطريقة من الدالةcaptureOutput(_, didOutput:from:)
فيAVCaptureVideoDataOutputSampleBufferDelegate
للحصول على النتائج بشكل متزامن من إطار الفيديو المحدّد. احتفظ بالقيمةAVCaptureVideoDataOutput
'salwaysDiscardsLateVideoFrames
علىtrue
للحدّ من عدد طلبات البحث التي يتم إرسالها إلى أداة الرصد. إذا توفّر إطار فيديو جديد أثناء تشغيل أداة الرصد، سيتم تجاهله. - إذا كنت تستخدم ناتج أداة رصد الوجوه لتراكب الرسومات على صورة الإدخال، احصل أولاً على النتيجة من "حزمة تعلُّم الآلة"، ثم اعرض الصورة والتراكب في خطوة واحدة. وبذلك، يتم عرض المحتوى على مساحة العرض مرة واحدة فقط لكل إطار إدخال معالج. يمكنك الاطّلاع على updatePreviewOverlayViewWithLastFrame في نموذج التشغيل السريع الخاص بـ ML Kit للحصول على مثال.
- ننصحك بالتقاط الصور بدقة أقل. ومع ذلك، يُرجى أيضًا مراعاة متطلبات أبعاد الصورة في واجهة برمجة التطبيقات هذه.
- لتجنُّب انخفاض الأداء المحتمل، لا تشغِّل عدة مثيلات
TextRecognizer
بخيارات نصوص برمجية مختلفة في الوقت نفسه.