ios - library - tesseract ocr swift 4
¿Por qué la biblioteca OCR de Tesseract(iOS) no puede reconocer texto en absoluto? (5)
Asegúrate de tener el último archivo tessdata del código de Google
http://code.google.com/p/tesseract-ocr/downloads/list
Esto le proporcionará una lista de archivos de tessdata que debe descargar e incluir en su aplicación si aún no lo ha hecho. En su caso, necesitará tesseract-ocr-3.02.eng.tar.gz ya que está buscando los archivos en inglés.
El siguiente artículo te mostrará dónde necesitas instalarlo. Leí este tutorial cuando construí mi primer proyecto de Tesseract y lo encontré realmente útil
http://lois.di-qual.net/blog/install-and-use-tesseract-on-ios-with-tesseract-ios/
Estoy intentando usar la biblioteca Tesseract OCR
en mi aplicación iOS. Descargué la biblioteca tesseract-ios de github y cuando traté de reconocer una imagen de texto simple obtuve basura en su lugar. Aquí hay una imagen de lo que traté de reconocer:
Tengo texto ilegible
T0I1101T0W KIR1 H1I1101T0W KIR1 H1I1101T0W CIBEPS H1 ES PBHY P306 EHH11 133I R1 11335 11I1Hazio de la mano 5 13H1H1H1H1H1H1H1HP2H1H1HP2H1H1HP1H1H1HP2H1H1HP2H1HP2H1HP2H1HP1H1H1HP1H1H1H1H1HP2H1H1H1HP2H1H1HP2H1H1H1HP2H1HP1H1H1HP2H1H1H1H1HP2H1H1HP2H1H1H1HP2H1H1HP2H1H1H1HP2H1H1H1HP2H1H1H1HP1HP1H1111H1131.
¿Por qué Tesseract no puede reconocer ni siquiera una imagen simple? Aquí está el código que utilicé para instanciar 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]);
Aquí está mi estructura de proyecto:
Agregué la carpeta testdata en inglés por referencia. Entonces, ¿qué estoy haciendo mal? ¿Cómo puedo arreglar esto?
Como dijo Adam, si quieres buenos resultados, tendrás que hacer un procesamiento de imágenes y configurar algunas configuraciones (incluir en la lista blanca ciertos caracteres, etc.).
Para cualquier otra persona que se haya topado con esta pregunta, he reunido un proyecto de ejemplo aquí que hace una lista blanca y el procesamiento de imágenes: https://github.com/mstrchrstphr/OCR-iOS-Example
Está utilizando la opción tessedit_char_whitelist con el valor "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" que limita el reconocimiento de caracteres a esta lista solamente. Sin embargo, la imagen que desea procesar contiene caracteres en minúsculas, si desea utilizar esta opción también tendrá que incluir caracteres en minúsculas.
[tesseractObject setVariableValue:@"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" forKey:@"tessedit_char_whitelist"];
lo que @ Adam Richardson explicó es correcto, junto con este método 1) de imagen en escala para aumentar el tamaño de la imagen (aumento de dimensiones)
func scaleImage (imagen: 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) almacenar este archivo de idioma eng.traineddata en el administrador de archivos
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) después de eso, puede usar https://github.com/BradLarson/GPUImage para aumentar la claridad de la imagen
puedes usar esto
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
}
estos 3 pasos le ayudarán a aumentar la precisión del tesseract hasta 60 ~ 70%
y mi salida es
Solución:
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];
para tessdata haga clic aquí