С помощью ML Kit можно распознавать текст на изображениях или видео, например, текст на дорожном знаке. Основные характеристики этой функции:
| API распознавания текста версии 2 | |
|---|---|
| Описание | Распознавание текста на изображениях или видео, поддержка латинского, китайского, деванагари, японского и корейского алфавитов, а также широкого спектра языков . |
| названия SDK | GoogleMLKit/TextRecognition |
| Выполнение | Ресурсы статически связываются с вашим приложением во время сборки. |
| влияние размера приложения | Примерно 38 МБ на один скрипт SDK |
| Производительность | На большинстве устройств SDK для латинского алфавита работает в режиме реального времени, на других — медленнее. |
Попробуйте!
- Поэкспериментируйте с примером приложения , чтобы увидеть, как используется этот API.
- Попробуйте сами выполнить код с помощью Codelab .
Прежде чем начать
- Включите следующие модули 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 поддерживается в Xcode версии 12.4 и выше.
1. Создайте экземпляр класса TextRecognizer
Создайте экземпляр TextRecognizer , вызвав метод +textRecognizer(options:) , передав параметры, относящиеся к SDK, который вы указали в качестве зависимости выше: Быстрый
// 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).Быстрый
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
Если вы используете
CMSampleBuffer, выполните следующие действия:Укажите ориентацию данных изображения, содержащихся в
CMSampleBuffer.Чтобы определить ориентацию изображения:
Быстрый
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и заданную ориентацию:Быстрый
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:):Быстрый
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можно получить текст, распознанный в данной области, и ограничивающие координаты этой области.Например:
Быстрый
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 входные изображения должны содержать текст, представленный достаточным количеством пикселей. В идеале каждый символ должен иметь размер не менее 16x16 пикселей. Как правило, увеличение размера символов до 24x24 пикселей не дает никаких преимуществ в точности.
Например, изображение размером 640x480 пикселей может хорошо подойти для сканирования визитной карточки, занимающей всю ширину изображения. Для сканирования документа, напечатанного на бумаге формата Letter, может потребоваться изображение размером 720x1280 пикселей.
Плохая фокусировка изображения может повлиять на точность распознавания текста. Если вы не получаете приемлемых результатов, попробуйте попросить пользователя повторно сделать снимок.
Если вы распознаёте текст в приложении реального времени, следует учитывать общие размеры входных изображений. Изображения меньшего размера обрабатываются быстрее. Для уменьшения задержки убедитесь, что текст занимает как можно большую часть изображения, и захватывайте изображения с более низким разрешением (с учётом требований к точности, упомянутых выше). Для получения дополнительной информации см. Советы по повышению производительности .
Советы по повышению производительности
- Для обработки видеокадров используйте синхронный API
results(in:)детектора. Вызовите этот метод из функцииcaptureOutput(_, didOutput:from:)вAVCaptureVideoDataOutputSampleBufferDelegate, чтобы синхронно получить результаты из заданного видеокадра. Установите параметрalwaysDiscardsLateVideoFramesвAVCaptureVideoDataOutputв значениеtrue, чтобы ограничить количество вызовов детектора. Если во время работы детектора появится новый видеокадр, он будет отброшен. - Если вы используете выходные данные детектора для наложения графики на входное изображение, сначала получите результат от ML Kit, а затем отрендерите изображение и наложение за один шаг. Таким образом, вы будете отрендеривать изображение на поверхности дисплея только один раз для каждого обработанного входного кадра. Пример можно увидеть в функции updatePreviewOverlayViewWithLastFrame в примере быстрого запуска ML Kit.
- Рекомендуется делать снимки с более низким разрешением. Однако также следует учитывать требования к размерам изображений, предъявляемые этим API.
- Во избежание возможного снижения производительности не запускайте одновременно несколько экземпляров
TextRecognizerс различными параметрами скрипта.
Если не указано иное, контент на этой странице предоставляется по лицензии Creative Commons "С указанием авторства 4.0", а примеры кода – по лицензии Apache 2.0. Подробнее об этом написано в правилах сайта. Java – это зарегистрированный товарный знак корпорации Oracle и ее аффилированных лиц.
Последнее обновление: 2026-01-28 UTC.
[[["Прост для понимания","easyToUnderstand","thumb-up"],["Помог мне решить мою проблему","solvedMyProblem","thumb-up"],["Другое","otherUp","thumb-up"]],[["Отсутствует нужная мне информация","missingTheInformationINeed","thumb-down"],["Слишком сложен/слишком много шагов","tooComplicatedTooManySteps","thumb-down"],["Устарел","outOfDate","thumb-down"],["Проблема с переводом текста","translationIssue","thumb-down"],["Проблемы образцов/кода","samplesCodeIssue","thumb-down"],["Другое","otherDown","thumb-down"]],["Последнее обновление: 2026-01-28 UTC."],[],[]]