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:

entrez la description de l'image ici

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:

entrez la description de l'image ici

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?

23
demandé sur Ahmad F 2013-06-18 16:42:07

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/

19
répondu Adam Richardson 2013-06-18 13:25:53

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"];
21
répondu Médéric Petit 2013-12-16 09:52:26

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

12
répondu Christopher 2013-06-22 06:00:47

entrez la description de l'image ici

Et ma sortie est

entrez la description de l'image ici

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

0
répondu Deepak Kumar 2016-11-08 08:29:14

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%

0
répondu Sujatha Girijala 2016-12-21 07:26:25