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:
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:
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?
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/
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"];
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
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%
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