Sie können mit ML Kit Text in Bildern oder Videos erkennen, z. B. den Text eines Straßenschilds. Die wichtigsten Merkmale dieser Funktion sind:
Text Recognition API v2 | |
---|---|
Beschreibung | Text in Bildern oder Videos erkennen, Unterstützung von lateinischen, chinesischen, Devanagari-, japanischen und koreanischen Schriftsystemen und einer Vielzahl von Sprachen. |
SDK-Namen | GoogleMLKit/TextRecognition |
Implementierung | Assets sind beim Build statisch mit Ihrer App verknüpft |
Auswirkungen auf die App-Größe | Ca. 38 MB pro Script-SDK |
Leistung | Echtzeitdaten auf den meisten Geräten für das SDK mit lateinamerikanischer Schrift, auf anderen langsamer. |
Ausprobieren
- Probieren Sie die Beispiel-App aus, um ein Beispiel für die Verwendung dieser API zu sehen.
- Probieren Sie den Code im Codelab selbst aus.
Hinweis
- Fügen Sie Ihrer Podfile-Datei die folgenden ML Kit-Pods hinzu:
# To recognize Latin script pod 'GoogleMLKit/TextRecognition', '3.2.0' # To recognize Chinese script pod 'GoogleMLKit/TextRecognitionChinese', '3.2.0' # To recognize Devanagari script pod 'GoogleMLKit/TextRecognitionDevanagari', '3.2.0' # To recognize Japanese script pod 'GoogleMLKit/TextRecognitionJapanese', '3.2.0' # To recognize Korean script pod 'GoogleMLKit/TextRecognitionKorean', '3.2.0'
- Nachdem Sie die Pods Ihres Projekts installiert oder aktualisiert haben, öffnen Sie Ihr Xcode-Projekt mit dem
.xcworkspace
. ML Kit wird ab Xcode-Version 12.4 unterstützt.
1. Instanz von TextRecognizer
erstellen
Erstellen Sie eine Instanz von TextRecognizer
, indem Sie +textRecognizer(options:)
aufrufen und die Optionen für das SDK übergeben, das Sie oben als Abhängigkeit deklariert haben:
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 Methode process(_:completion:)
von TextRecognizer
:
Erstellen Sie mit UIImage
oder CMSampleBuffer
ein VisionImage
-Objekt.
Wenn du UIImage
verwendest, gehe so vor:
- Erstellen Sie mit der
UIImage
einVisionImage
-Objekt. Achte darauf, den richtigen.orientation
anzugeben.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
Wenn du CMSampleBuffer
verwendest, gehe so vor:
-
Geben Sie die Ausrichtung der Bilddaten an, die in
CMSampleBuffer
enthalten sind.So rufen Sie die Bildausrichtung ab:
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; } }
- Erstelle mit dem Objekt
CMSampleBuffer
und der Ausrichtung einVisionImage
-Objekt: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 das Bild dann an die Methode 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 aus erkannten Textblöcken extrahieren
Wenn die Texterkennung erfolgreich ist, wird ein Text
-Objekt zurückgegeben. Ein Text
-Objekt enthält den vollständigen im Bild erkannten Text und null oder mehr TextBlock
-Objekte.
Jedes TextBlock
stellt einen rechteckigen Textblock dar, der null oder mehr TextLine
-Objekte enthält. Jedes 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 können Sie den in der Region erkannten Text sowie die Begrenzungskoordinaten der Region abrufen.
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 genau erkennt, müssen die Eingabebilder Text enthalten, der durch eine ausreichende Anzahl von Pixeldaten dargestellt wird. Idealerweise sollte jedes Zeichen mindestens 16 × 16 Pixel groß sein. Bei Zeichen, die größer als 24 x 24 Pixel sind, ergibt sich in der Regel keine Verbesserung der Genauigkeit.
Ein Bild mit 640 × 480 Pixeln eignet sich beispielsweise gut zum Scannen einer Visitenkarte, das die gesamte Breite des Bildes einnimmt. Zum Scannen eines auf Papier im Briefformat gedruckten Dokuments ist möglicherweise ein Bild mit 720 × 1280 Pixeln erforderlich.
-
Ein schlechter Bildfokus kann die Genauigkeit der Texterkennung beeinträchtigen. Wenn die Ergebnisse nicht akzeptabel sind, kannst du den Nutzer bitten, das Bild neu aufzunehmen.
-
Wenn Sie Text in einer Echtzeitanwendung erkennen, sollten Sie die Gesamtabmessungen der Eingabebilder berücksichtigen. Kleinere Bilder können schneller verarbeitet werden. Achten Sie zum Reduzieren der Latenz darauf, dass der Text so viel wie möglich auf dem Bild einnimmt, und erfassen Sie Bilder mit niedrigeren Auflösungen (unter Berücksichtigung der oben genannten Genauigkeitsanforderungen). Weitere Informationen finden Sie unter Tipps zur Leistungsverbesserung.
Tipps zur Leistungsverbesserung
- Verwenden Sie zum Verarbeiten von Videoframes die synchrone
results(in:)
API des Detektors. Rufen Sie diese Methode über diecaptureOutput(_, didOutput:from:)
-Funktion vonAVCaptureVideoDataOutputSampleBufferDelegate
auf, um synchron Ergebnisse aus dem angegebenen Videoframe abzurufen. Behalten Sie diealwaysDiscardsLateVideoFrames
vonAVCaptureVideoDataOutput
alstrue
bei, um Aufrufe an den Detektor zu drosseln. Wenn ein neuer Videoframe verfügbar wird, während der Detektor ausgeführt wird, wird er gelöscht. - Wenn Sie die Ausgabe des Detektors verwenden, um Grafiken über das Eingabebild einzublenden, rufen Sie zuerst das Ergebnis aus dem ML Kit ab und rendern Sie dann das Bild und das Overlay in einem einzigen Schritt. Dadurch wird für jeden verarbeiteten Eingabeframe nur einmal ein Rendering auf der Anzeigeoberfläche ausgeführt. Ein entsprechendes Beispiel finden Sie im ML Kit-Schnellstartbeispiel unter updatePreviewOverlayViewWithLastFrame.
- Nehmen Sie Bilder mit einer niedrigeren Auflösung auf. Beachten Sie aber auch die Anforderungen dieser API an die Bildabmessung.
- Führen Sie nicht mehrere
TextRecognizer
-Instanzen mit unterschiedlichen Skriptoptionen gleichzeitig aus, um potenzielle Leistungseinbußen zu vermeiden.