Mit ML Kit können Sie Text in Bildern oder Videos erkennen, z. B. Text von ein Straßenschild. Die Hauptmerkmale dieser Funktion sind:
Texterkennung v2 API | |
---|---|
Beschreibung | Text in Bildern oder Videos erkennen, Unterstützung für Lateinische, chinesische, Devanagari-, japanische und koreanische Schriftzeichen sowie eine Große Auswahl an Sprachen. |
SDK-Namen | GoogleMLKit/TextRecognition |
Implementierung | Assets sind bei der Erstellung statisch mit Ihrer App verknüpft |
Auswirkungen auf die App-Größe | Etwa 38 MB pro Script-SDK |
Leistung | Echtzeit auf den meisten Geräten für Latin Script SDK, langsamer für andere. |
Jetzt ausprobieren
- In der Beispielanwendung sehen Sie ein Beispiel für die Verwendung dieser API.
- Testen Sie den Code selbst mit dem Codelab.
Vorbereitung
- Fügen Sie Ihrer Podfile-Datei die folgenden ML Kit-Pods hinzu:
# To recognize Latin script pod 'GoogleMLKit/TextRecognition', '15.5.0' # To recognize Chinese script pod 'GoogleMLKit/TextRecognitionChinese', '15.5.0' # To recognize Devanagari script pod 'GoogleMLKit/TextRecognitionDevanagari', '15.5.0' # To recognize Japanese script pod 'GoogleMLKit/TextRecognitionJapanese', '15.5.0' # To recognize Korean script pod 'GoogleMLKit/TextRecognitionKorean', '15.5.0'
- Nachdem Sie die Pods Ihres Projekts installiert oder aktualisiert haben, öffnen Sie Ihr Xcode-Projekt mit dem
.xcworkspace
ML Kit wird in Xcode-Version 12.4 oder höher unterstützt.
1. Instanz von TextRecognizer
erstellen
Erstellen Sie eine Instanz von TextRecognizer
durch folgenden Aufruf:
+textRecognizer(options:)
, wobei die Optionen für das SDK übergeben werden, das du als
Abhängigkeit von oben:
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. Eingabebild vorbereiten
Übergeben Sie das Bild alsUIImage
oder CMSampleBufferRef
an die process(_:completion:)
-Methode von TextRecognizer
:
Erstellen Sie ein VisionImage
-Objekt mithilfe von UIImage
oder einem
CMSampleBuffer
Wenn du ein UIImage
verwendest, gehe so vor:
- Erstellen Sie ein
VisionImage
-Objekt mit derUIImage
. Geben Sie die richtige.orientation
an.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
Wenn Sie ein CMSampleBuffer
verwenden, gehen Sie so vor:
-
Geben Sie die Ausrichtung der Bilddaten an, die in
CMSampleBuffer
enthalten sind.So ermitteln Sie die Bildausrichtung:
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; } }
- Erstellen Sie ein
VisionImage
-Objekt mithilfe derCMSampleBuffer
-Objekt und Ausrichtung: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. Bild verarbeiten
Übergeben Sie dann das Bild an die process(_:completion:)
-Methode:
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 aus erkannten Textblöcken extrahieren
Wenn der Vorgang der Texterkennung erfolgreich ist, wird ein
Text
-Objekt. Ein Text
-Objekt enthält den vollständigen im Bild erkannten Text und null oder mehr TextBlock
-Objekte.
Jedes TextBlock
steht für einen rechteckigen Textblock.
null oder mehr TextLine
-Objekte enthalten. Jeweils TextLine
Objekt enthält null oder mehr TextElement
-Objekte.
die Wörter und wortähnliche Entitäten wie Datumsangaben und Zahlen darstellen.
Für jedes TextBlock
, TextLine
und
TextElement
-Objekt enthält, können Sie den Text im
Region und die Begrenzungskoordinaten der Region.
Beispiel:
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; } } }
Richtlinien für Eingabebilder
-
Damit ML Kit Text richtig erkennt, müssen die Eingabebilder Folgendes enthalten: Text, der durch ausreichende Pixeldaten dargestellt wird. Idealerweise sollte jedes Zeichen mindestens 16 × 16 Pixel groß sein. In der Regel ist es nicht genauer, wenn Zeichen größer als 24 × 24 Pixel sind.
Ein Bild im Format 640 x 480 eignet sich also gut zum Scannen einer Visitenkarte. das die volle Breite des Bilds ausfüllt. So scannen Sie ein aufgedrucktes Dokument: im Schriftformat erforderlich ist, ist möglicherweise ein Bild mit 720 x 1280 Pixeln erforderlich.
-
Ein unscharfer Bildfokus kann die Genauigkeit der Texterkennung beeinträchtigen. Wenn nicht akzeptable Ergebnisse erzielen, versuchen Sie, das Bild erneut aufzunehmen.
-
Wenn Sie Text in einer Echtzeitanwendung erkennen, sollten Sie die Gesamtabmessungen der Eingabebilder. Kleiner Bilder schneller verarbeitet werden. Um die Latenz zu verringern, sollte der Text möglichst viel Platz im Bild einnehmen. Außerdem sollten Sie Bilder mit niedrigerer Auflösung aufnehmen, wobei Sie die oben genannten Anforderungen an die Genauigkeit beachten. Weitere Informationen finden Sie unter Tipps zur Leistungssteigerung
Tipps zur Leistungsverbesserung
- Verwende zur Verarbeitung von Videoframes die synchrone
results(in:)
API des Detektors. Rufe diese Methode über die FunktioncaptureOutput(_, didOutput:from:)
vonAVCaptureVideoDataOutputSampleBufferDelegate
auf, um synchron Ergebnisse aus dem angegebenen Videoframe abzurufen. Lassen SiealwaysDiscardsLateVideoFrames
vonAVCaptureVideoDataOutput
unverändert auftrue
, um Anrufe an den Detektor zu begrenzen. Wenn ein neuer verfügbar wird, während der Detektor läuft, wird er verworfen. - Wenn Sie die Ausgabe des Detektors verwenden, um Grafiken auf das Eingabebild zu legen, rufen Sie zuerst das Ergebnis aus ML Kit ab und rendern Sie dann das Bild und das Overlay in einem einzigen Schritt. Dadurch rendern Sie auf der Anzeigeoberfläche pro verarbeitetem Eingabeframe nur einmal. Ein Beispiel finden Sie in der ML Kit-Kurzanleitung unter updatePreviewOverlayViewWithLastFrame.
- Nehmen Sie Bilder mit einer niedrigeren Auflösung auf. Denken Sie jedoch auch daran, Anforderungen an die Bildabmessungen dieser API.
- Führen Sie nicht mehrere
TextRecognizer
-Instanzen mit unterschiedlichen Scriptoptionen gleichzeitig aus, um Leistungseinbußen zu vermeiden.