recognition - Formato de imagen Tesseract OCR iOS
tesseract ios (1)
He usado Tesseract OCR iOS para escanear texto, y lo he conseguido para trabajar con una foto incluida en el proyecto.
Pero al pasarle un UIImage del UIImagePickerController, no funciona. Configuré esta prueba simple:
- Tome la imagen original del selector, y alístala a tesseract: No funciona.
- Guarde el UIImage como JPEG, cópielo del contenedor de la aplicación, inclúyalo en el proyecto y proporciónelo a tesseract: no funciona.
- Abra el UIImage guardado en photoshop y guárdelo nuevamente (sin cambios con la configuración predeterminada de calidad JPEG 12). Inclúyalo en el proyecto al alimentarlo a tesseract: ¿Funciona?!?
Tesseract reconoce la cantidad correcta de líneas en el original, pero como basura (he probado varias pruebas de ejemplo). Una vez guardada en Photoshop, la imagen tiene una buena tasa de reconocimiento.
Simplemente no puedo entender qué está mal con el UII original que Photoshop arregla de alguna manera. ¡Por favor ayuda!
Aquí están las imágenes:
El código para alimentar imágenes a tesseract:
- (void)recognizeWithImage:(UIImage *)image {
G8RecognitionOperation *operation = [[G8RecognitionOperation alloc] initWithLanguage:@"dan"];
operation.tesseract.image = image;
self.imageView.image = image;
operation.recognitionCompleteBlock = ^(G8Tesseract *recognizedTesseract) {
NSLog(@"Result:/n%@", [recognizedTesseract recognizedText]);
};
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:operation];
}
Aquí está el código para obtener la imagen de la cámara:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
[self dismissViewControllerAnimated:YES completion:nil];
UIImage *originalImage = info[UIImagePickerControllerOriginalImage];
NSData *dataForJPEGFile = UIImageJPEGRepresentation(originalImage, 1.0);
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath = [paths[0] stringByAppendingPathComponent:@"temp_ocr_image_orig.jpg"];
[dataForJPEGFile writeToFile:filePath atomically:YES];
[self recognizeWithImage:originalImage];
}
Y la prueba de los dos archivos de imagen:
[self recognizeWithImage:[UIImage imageNamed:@"temp_ocr_image_orig.jpg"]];
[self recognizeWithImage:[UIImage imageNamed:@"temp_ocr_image_photoshopped.jpg"]];
La orientation
image
es diferente para ambas imágenes. Cuando carga las imágenes en el motor: en su caso, ambas imágenes se producen como imágenes con diferentes orientaciones al motor:
Así es como se ven enfrente del motor:
Imagen original:
Imagen de Photoshop:
Si miras detenidamente, ambos se presentan de forma diferente. Creo que UIImageJPEGRepresentation
está haciendo algo loco o cuando escribes la image
en el container
, la imagen adquiere una orientación diferente.
Necesita modificar la orientación de la imagen que obtiene del selector o de su contenedor.
Hice algunas combinaciones para obtener la orientación correcta como la imagen de Photoshop:
//image is the original image
UIImage *imageToDisplay =[UIImage imageWithCGImage:[image CGImage]
scale:1.0
orientation: UIImageOrientationRight];
UIImage *newImage= [UIImage imageWithCGImage:[imageToDisplay CGImage]
scale:1.0
orientation: UIImageOrientationDown];
UIImage *newImage2= [UIImage imageWithCGImage:[newImage CGImage]
scale:1.0
orientation: UIImageOrientationLeft];
//Now I get the correct orientation
// Set the image on which Tesseract should perform recognition
operation.tesseract.image = newImage2 ;
Y ahora puede obtener el texto de OCR como se esperaba.
Deberías tratar de obtener la orientación correcta en una línea de código. He usado 3 rotaciones aquí.