Pourquoi Tesseract OCR library (iOS) ne peut pas reconnaître le texte du tout?
J'essaie d'utiliser la bibliothèque Tesseract OCR
dans mon application iOS. J'ai téléchargé la bibliothèque tesseract-ios de github et quand j'ai essayé de reconnaître une simple image de texte, j'ai eu des ordures à la place. Voici une image de ce que j'ai essayé de reconnaître:
J'ai un texte illisible:
T0I1101T0W KIR1 H1I1101T0W KIR1 H1I1101T0W CIBEPS H1 es PBHY P306 EHH11 133I R1 11335 11I1H1 19 13S SYIL 3B19 m H300H1911 H1113 AIR1 J1 OIII 3I9SH5H133IS 13V9 I1 Q1H211 E015 19 W331 H1 111SW
Pourquoi Tesseract ne peut même pas reconnaître une image simple? Voici le code que j'ai utilisé pour instancier Tesseract:
Tesseract* tesseractObject = [[Tesseract alloc] initWithDataPath:@"tessdata" language:@"eng"];
[tesseractObject setVariableValue:@"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" forKey:@"tessedit_char_whitelist"];
[tesseractObject setImage:image];
[tesseractObject recognize];
NSLog(@"RECOGNISED= %@" , [tesseractObject recognizedText]);
Voici la structure de mon projet:
J'ai ajouté le dossier anglais Testdata par référence. Donc, ce que je fais mal? Comment puis-je résoudre ce problème?
5 réponses
Assurez-vous d'avoir le dernier fichier tessdata de Google code
Http://code.google.com/p/tesseract-ocr/downloads/list
Cela vous fournira une liste des fichiers tessdata que vous devez télécharger et inclure dans votre application si vous ne l'avez pas déjà fait. Dans votre cas, vous aurez besoin de tesseract-ocr-3.02.eng.tar.gz comme vous recherchez les fichiers de langue anglaise
L'article suivant vous montrera où vous devez l'installer. J'ai lu ce tutoriel, lorsque J'ai construit mon premier projet Tesseract et l'ai trouvé vraiment utile
Http://lois.di-qual.net/blog/install-and-use-tesseract-on-ios-with-tesseract-ios/
Vous utilisez l'option tessedit_char_whitelist avec la valeur "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" qui limite la reconnaissance de caractères à cette liste uniquement. Cependant l'image que vous souhaitez traiter contient des caractères minuscules, si vous souhaitez utiliser cette option, vous devez inclure la réduction du nombre de cas char trop.
[tesseractObject setVariableValue:@"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" forKey:@"tessedit_char_whitelist"];
Comme Adam l'a dit, si vous voulez de bons résultats, vous devrez effectuer un traitement d'image et configurer certains paramètres (liste blanche de certains caractères, etc.).
Pour quelqu'un d'autre qui trébuche sur cette question, j'ai mis en place un Exemple de projet ici qui fait une liste blanche et un traitement d'image: https://github.com/mstrchrstphr/OCR-iOS-Example
Et ma sortie est
Solution:
tesseract.language = @"eng+fra";
tesseract.pageSegmentationMode = G8PageSegmentationModeAuto;
tesseract.engineMode = G8OCREngineModeTesseractCubeCombined;
tesseract.image = [image.image g8_blackAndWhite];
tesseract.maximumRecognitionTime = 60.0;
[tesseract recognize];
NSLog(@"%@", tesseract.recognizedText);
reco_area.text = [tesseract recognizedText];
Pour tessdata cliquez ici
Tout ce que @ Adam Richardson a expliqué est correct avec cela ajoutez cette méthode 1) scaleimage pour augmenter la taille de l'image (les dimensions augmentent)
Func scaleImage(image: UIImage, maxDimension: CGFloat) - > UIImage {
var scaledSize = CGSize(width: maxDimension, height: maxDimension)
var scaleFactor: CGFloat
if image.size.width > image.size.height {
scaleFactor = image.size.height / image.size.width
scaledSize.width = maxDimension
scaledSize.height = scaledSize.width * scaleFactor
} else {
scaleFactor = image.size.width / image.size.height
scaledSize.height = maxDimension
scaledSize.width = scaledSize.height * scaleFactor
}
UIGraphicsBeginImageContext(scaledSize)
image.draw(in: CGRect(x: 0, y: 0, width: scaledSize.width, height: scaledSize.height))
let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return scaledImage!
}
2) stockez cette eng.fichier de langue traineddata dans filemanager
func storeLanguageFile() throws{
var fileManager: FileManager = FileManager.default
let nsDocumentDirectory = FileManager.SearchPathDirectory.documentDirectory
let nsUserDomainMask = FileManager.SearchPathDomainMask.userDomainMask
let docDirectory = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true)[0] as NSString
let path: String = docDirectory.appendingPathComponent("/tessdata/eng.traineddata")
if fileManager.fileExists(atPath: path){
var data: NSData = NSData.dataWithContentsOfMappedFile((Bundle.main.resourcePath?.appending("/tessdata/eng.traineddata"))!)! as! NSData
var error: NSError
try FileManager.default.createDirectory(atPath: docDirectory.appendingPathComponent("/tessdata"), withIntermediateDirectories: true, attributes: nil)
data.write(toFile: path, atomically: true)
}
}
3) après que vous pouvez utiliser https://github.com/BradLarson/GPUImage pour augmenter la clarté de l'image
Vous pouvez utiliser ceci
func preprocessedImage(for tesseract: G8Tesseract!, sourceImage: UIImage!) -> UIImage! {
var stillImageFilter: GPUImageAdaptiveThresholdFilter = GPUImageAdaptiveThresholdFilter()
stillImageFilter.blurRadiusInPixels = 4.0
var filterImage: UIImage = stillImageFilter.image(byFilteringImage: sourceImage)
return filterImage
}
Ces 3 étapes vous aideront à augmenter la précision du tesseract jusqu'à 60 ~ 70%