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 |
Auswirkung auf die App-Größe | Ca. 38 MB pro Script-SDK |
Leistung | Echtzeit auf den meisten Geräten für Latin Script SDK, langsamer für andere. |
Jetzt ausprobieren
- Probieren Sie die Beispiel-App aus, um sehen Sie sich ein Anwendungsbeispiel für diese API an.
- Testen Sie den Code mit dem Codelab erhalten.
Hinweis
- Fügen Sie die folgenden ML Kit-Pods in Ihre Podfile-Datei ein:
# To recognize Latin script pod 'GoogleMLKit/TextRecognition', '7.0.0' # To recognize Chinese script pod 'GoogleMLKit/TextRecognitionChinese', '7.0.0' # To recognize Devanagari script pod 'GoogleMLKit/TextRecognitionDevanagari', '7.0.0' # To recognize Japanese script pod 'GoogleMLKit/TextRecognitionJapanese', '7.0.0' # To recognize Korean script pod 'GoogleMLKit/TextRecognitionKorean', '7.0.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
durch folgenden Aufruf:
+textRecognizer(options:)
, wobei die Optionen für das SDK übergeben werden, das du als
Abhängigkeit von oben:
// 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)
// 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 den
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.let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
Wenn du ein CMSampleBuffer
verwendest, gehe so vor:
-
Geben Sie die Ausrichtung der Bilddaten an, die in der
CMSampleBuffer
So ermitteln Sie die Bildausrichtung:
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 } }
- (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:let image = VisionImage(buffer: sampleBuffer) image.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition)
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 Methode process(_:completion:)
:
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // Error handling return } // Recognized text }
[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 Text
im Bild erkannt 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:
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 } } }
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 x 16 Pixel groß sein. In der Regel gibt es keine Verbesserung der Genauigkeit bei Zeichen, die größer als 24 x 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: Schriftgröße im Format 720 x 1280 Pixel erforderlich ist.
-
Ein schlechter 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. Stellen Sie sicher, dass der Text möglichst viel möglichst genaue Bilder zu erstellen und sie mit geringerer Auflösung zu erfassen. Dabei ist die Genauigkeit oben genannten Anforderungen). Weitere Informationen finden Sie unter Tipps zur Leistungssteigerung
Tipps zur Verbesserung der Leistung
- Verwende zum Verarbeiten von Videoframes die synchrone
results(in:)
API des Detektors. Anruf diese Methode aus demAVCaptureVideoDataOutputSampleBufferDelegate
<ph type="x-smartling-placeholder"></ph>captureOutput(_, didOutput:from:)
-Funktion, um synchron Ergebnisse aus dem angegebenen Video abzurufen Frame. beibehalten vonAVCaptureVideoDataOutput
alwaysDiscardsLateVideoFrames
alstrue
, um Aufrufe an den Detektor zu drosseln. Wenn ein neuer verfügbar wird, während der Detektor läuft, wird er verworfen. - Wenn Sie die Ausgabe des Detektors verwenden, um Grafiken Eingabebild, rufen Sie zuerst das Ergebnis aus ML Kit ab und rendern Sie das Bild in einem Schritt übereinanderlegen. Dadurch rendern Sie auf der Anzeigeoberfläche pro verarbeitetem Eingabeframe nur einmal. Weitere Informationen finden Sie im Abschnitt updatePreviewOverlayViewWithLastFrame. im Beispiel der ML Kit-Kurzanleitung finden Sie ein Beispiel.
- Nehmen Sie Bilder mit einer niedrigeren Auflösung auf. Denken Sie jedoch auch daran, Anforderungen an die Bildabmessungen dieser API.
- Um potenzielle Leistungseinbußen zu vermeiden, sollten Sie
TextRecognizer
Instanz mit unterschiedlichen Skriptoptionen gleichzeitig.