OCR: Image au texte?
Avant de marquer que de copier ou de répéter la question, merci de lire l'ensemble de la question en premier.
Je suis capable de faire à pressent est comme ci-dessous:
- Pour obtenir de l'image et de la culture de la pièce souhaitée pour l'OCR.
- Le traitement de l'image à l'aide de
tesseract
etleptonica
. - Appliquée lorsque le document est coupée en morceaux ie 1 caractère par l'image qu'il donne de 96% de précision.
- Si je ne fais pas ça, et le document de fond est de couleur blanche et le texte est en noir couleur, il donne presque la même précision.
Par exemple, si l'entrée est comme cette photo :
Photo de début
Photo fin
Ce que je veux, c'est pouvoir obtenir la même précision pour cette photo
sans générer de blocs.
Le code que j'ai utilisé pour init tesseract et extraire du texte à partir de l'image est comme ci-dessous:
Pour l'initialisation des tesseract
.h fichier
tesseract::TessBaseAPI *tesseract;
uint32_t *pixels;
.m fichier
tesseract = new tesseract::TessBaseAPI();
tesseract->Init([dataPath cStringUsingEncoding:NSUTF8StringEncoding], "eng");
tesseract->SetPageSegMode(tesseract::PSM_SINGLE_LINE);
tesseract->SetVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
tesseract->SetVariable("language_model_penalty_non_freq_dict_word", "1");
tesseract->SetVariable("language_model_penalty_non_dict_word ", "1");
tesseract->SetVariable("tessedit_flip_0O", "1");
tesseract->SetVariable("tessedit_single_match", "0");
tesseract->SetVariable("textord_noise_normratio", "5");
tesseract->SetVariable("matcher_avg_noise_size", "22");
tesseract->SetVariable("image_default_resolution", "450");
tesseract->SetVariable("editor_image_text_color", "40");
tesseract->SetVariable("textord_projection_scale", "0.25");
tesseract->SetVariable("tessedit_minimal_rejection", "1");
tesseract->SetVariable("tessedit_zero_kelvin_rejection", "1");
Pour obtenir un texte à partir d'une image
- (void)processOcrAt:(UIImage *)image
{
[self setTesseractImage:image];
tesseract->Recognize(NULL);
char* utf8Text = tesseract->GetUTF8Text();
int conf = tesseract->MeanTextConf();
NSArray *arr = [[NSArray alloc]initWithObjects:[NSString stringWithUTF8String:utf8Text],[NSString stringWithFormat:@"%d%@",conf,@"%"], nil];
[self performSelectorOnMainThread:@selector(ocrProcessingFinished:)
withObject:arr
waitUntilDone:YES];
free(utf8Text);
}
- (void)ocrProcessingFinished0:(NSArray *)result
{
UIAlertView *alt = [[UIAlertView alloc]initWithTitle:@"Data" message:[result objectAtIndex:0] delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
[alt show];
}
Mais je ne reçois pas de bon de sortie pour la plaque d'immatriculation de l'image, soit il est nul ou il donne des ordures de données pour l'image.
Et si j'utilise l'image qui est la première ie fond blanc avec texte noir, puis la sortie est de 89 à 95% de précision.
Merci de m'aider.
Toutes suggestions seront appréciées.
Mise à jour
Grâce à @jcesar pour assurer le lien et aussi à @konstantin pribluda de fournir de précieuses informations et guide.
Je suis capable de convertir les images dans le bon noir et blanc (ou presque). et si la reconnaissance est meilleure pour toutes les images 🙂
Besoin d'aide avec une bonne binarisation d'images. Toute Idée sera apprécié
source d'informationauteur The iOSDev | 2012-11-06
Vous devez vous connecter pour publier un commentaire.
Salut à tous Merci pour vos réponses, de toutes ces réponses, je suis en mesure d'obtenir cette conclusion comme ci-dessous:
Au-dessus de 4 étapes sont combinées à une méthode comme ça comme ci-dessous :
Remarque:
Mise à JOUR :
Il suffit de remplacer la méthode ci-dessus(
getRGBAsFromImage:
) code avec celui-ci et le résultat est le même, mais le temps n'est que de 0.1 à 0.3 seconde seulement.J'ai été en mesure d'atteindre près de des résultats instantanés à l'aide de la démo photo fournie ainsi qu'il générer les lettres correctes.
Je l'ai pré-traitée de l'image à l'aide de GPUImage
Et ensuite l'envoyer que l'image traitée à TESS
Ce gauche " marques pour le -, mais elles sont aussi faciles à enlever. En fonction de l'image que vous avez vous pourriez avoir à l'affiner un peu, mais ça devrait vous faire bouger dans la bonne direction.
Laissez-moi savoir si vous avez des problèmes pour l'utiliser, c'est à partir d'un projet que j'utilise et je n'avais pas envie de dépouiller tout ou créer un projet à partir de zéro.
Je crois pouvoir dire que tesseract sera surpuissante pour votre but. Vous n'avez pas besoin de dictionnaire correspondant à améliorer la reconnaissance de la qualité ( vous ne disposez pas de ce dictionnaire , mais peut-être des moyens pour calculer la somme de contrôle sur le numéro de licence ), et vous avez de la police optimisée pour l'OCR.
Et le meilleur de tous, vous avez des marqueurs (orange et bleu de la couleur des zones de proximité sont bons) pour trouver de la région dans l'image.
J'ai mon ROC apps-je utiliser de l'homme aidé de la zone d'intérêt de recherche ( juste en visant l'aide de superposition de plus de prévisualisation de la caméra). Habituellement, on utilise quelque chose comme haar cascade de localiser d'autres fonctionnalités intéressantes comme des visages. Vous pouvez également calculer le centre de gravité de l'orange de la zone, ou tout simplement de la boîte englobante de l'orange pixels simplement en parcourant toutes les images et les stoing de gauche /de droite /supérieur /inférieur de pixels de la couleur adéquate
Comme pour la reconnaissance itselff je vous recommande d'utiliser invariant moments ( pas sûr que ce soit mis en œuvre dans le tesseract, mais vous pouvez facilement le port de java projet: http://sourceforge.net/projects/javaocr/ )
J'ai essayé de mon demo app sur le moniteur de l'image et il a reconnu les chiffres sur le sport (n'est pas formé
pour les personnages)
Comme pour la binarisation ( séparation de noir, de blanc ) je recommande sauvola méthode car cela donne la meilleure tolérance aux changements de luminance ( également mis en place de notre projet ROC )