web-dev-qa-db-fra.com

Pourquoi la bibliothèque OCR de Tesseract (iOS) ne reconnaît-elle pas du texte?

J'essaie d'utiliser la bibliothèque Tesseract OCR dans mon application iOS. J'ai téléchargé la bibliothèque tesseract-ios à partir de github et lorsque j'ai essayé de reconnaître une image texte simple, j'ai eu des problèmes de mémoire. Voici une image de ce que j'ai essayé de reconnaître:

enter image description here

J'ai un texte illisible:

T0I1101T0W KIR1 H1I1101T0W KIR1 H1I1101T0W CIBEPS H1 PBHY P306. EHH11 133I R1 11335 11I1H1 19 13S SYIL 3B19 M H300H1911 H1113 AIR1 J1OIII 3I9SH5H133IS 13V9 I1 Q1H211 E015 19 W331 H1 111SW

Pourquoi Tesseract ne peut pas reconnaître même 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:

enter image description here

J'ai ajouté le dossier testdata en anglais par référence. Alors qu'est-ce que je fais mal? Comment puis-je réparer cela?

24

Assurez-vous de disposer du dernier fichier tessdata du code Google.

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 car vous recherchez les fichiers en anglais.

L'article suivant vous montrera où vous devez l'installer. J'ai lu ce tutoriel lorsque j'ai construit mon premier projet Tesseract et que je l'ai trouvé vraiment utile

http://lois.di-qual.net/blog/install-and-use-tesseract-on-ios-with-tesseract-ios/

19
Adam Richardson

Vous utilisez l'option tessedit_char_whitelist avec la valeur "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", qui limite la reconnaissance des caractères à cette liste uniquement. Toutefois, l'image que vous souhaitez traiter contient des caractères minuscules. Si vous souhaitez utiliser cette option, vous devez également inclure des caractères minuscules.

[tesseractObject setVariableValue:@"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" forKey:@"tessedit_char_whitelist"];
21
Médéric Petit

Comme Adam l'a dit, si vous voulez obtenir de bons résultats, vous devrez effectuer un traitement de l'image et configurer certains paramètres (liste blanche de certains caractères, etc.).

Pour ceux qui tombent sur cette question, j’ai mis sur pied un exemple de projet ici qui effectue un traitement de la liste blanche et du traitement des images: https://github.com/mstrchrstphr/OCR-iOS-Example

12
Christopher

quel que soit @ Adam Richardson expliqué est correct avec cela ajouter ce 1) scaleimage méthode pour augmenter la taille de l'image (dimensions augmenter)

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) stocker ce fichier de langue eng.traineddata dans le gestionnaire de fichiers

 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 cela, vous pouvez utiliser https://github.com/BradLarson/GPUImage for pour augmenter la clarté de l'image

tu peux utiliser ça 

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
Sujatha Girijala

 enter image description here

et ma sortie est 

 enter image description here

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
Deepak Kumar