open - tesseract ocr c# codeproject
Ejemplo simple de OCR de Tesseract (8)
Hola, ¿puede alguien darme un ejemplo sencillo de probar Tesseract OCR preferiblemente en C #?
Probé la demo encontrada here . Descargo el conjunto de datos en inglés y descomprimido en la unidad C. y modifiqué el código como sigue:
string path = @"C:/pic/mytext.jpg";
Bitmap image = new Bitmap(path);
Tesseract ocr = new Tesseract();
ocr.SetVariable("tessedit_char_whitelist", "0123456789"); // If digit only
ocr.Init(@"C:/tessdata/", "eng", false); // To use correct tessdata
List<tessnet2.Word> result = ocr.DoOCR(image, Rectangle.Empty);
foreach (tessnet2.Word word in result)
Console.WriteLine("{0} : {1}", word.Confidence, word.Text);
Desafortunadamente el código no funciona. el programa muere en la línea "ocr.Init (..."). Ni siquiera pude obtener una excepción, incluso usando try-catch.
¡Pude correr el vietocr ! Pero ese es un proyecto muy grande para mi seguimiento. Necesito un ejemplo simple como el de arriba.
Gracias
Aquí hay un gran proyecto de ejemplo de trabajo; Muestra de OCR de Tesseract (Visual Studio) con preprocesamiento de Leptonica Muestra de OCR de Tesseract (Visual Studio) con preprocesamiento de Leptonica
La API de Tesseract OCR 3.02.02 puede ser confusa, así que esto lo guía a través de la inclusión de la dll de Tesseract y Leptonica en un proyecto de Visual Studio C ++, y proporciona un archivo de muestra que toma una ruta de imagen para preprocesar y OCR. La secuencia de comandos de preprocesamiento en Leptonica convierte la imagen de entrada en texto similar a un libro en blanco y negro.
Preparar
Para incluir esto en sus propios proyectos, deberá hacer referencia a los archivos de encabezado y lib y copiar las carpetas de tessdata y archivos DLL.
Copie la carpeta tesseract-include en la carpeta raíz de su proyecto. Ahora haga clic en su proyecto en el Explorador de soluciones de Visual Studio y vaya a Proyecto> Propiedades.
Directorios VC ++> Incluir directorios:
.. / tesseract-include / tesseract; .. / tesseract-include / leptonica; $ (IncludePath) C / C ++> Preprocesador> Definiciones de preprocesador:
_CRT_SECURE_NO_WARNINGS;% (PreprocessorDefinitions) C / C ++> Vinculador> Entrada> Dependencias adicionales:
.. / tesseract-include / libtesseract302.lib; .. / tesseract-include / liblept168.lib;% (Dependencias adicionales) Ahora puede incluir encabezados en el archivo de su proyecto:
incluir
incluir
Ahora copie los dos archivos dll en tesseract-include y la carpeta tessdata en Debug al directorio de salida de su proyecto.
Cuando inicializa tesseract, debe especificar la ubicación de la carpeta principal (! Important) de la carpeta tessdata si aún no es el directorio actual de su archivo ejecutable. Puedes copiar mi script, que asume que tessdata está instalado en la carpeta del ejecutable.
tesseract :: TessBaseAPI * api = nuevo tesseract :: TessBaseAPI (); api-> Init ("D: / tessdataParentFolder /", ... Muestra
Puede compilar la muestra provista, que toma un argumento de línea de comando de la ruta de la imagen para usar. La función preprocess () utiliza Leptonica para crear una copia de la imagen similar a un libro en blanco y negro que hace que Tesseract funcione con el 90% de precisión. La función ocr () muestra la funcionalidad de la API de Tesseract para devolver un resultado de cadena. El toClipboard () se puede usar para guardar texto en el portapapeles en Windows. Puedes copiarlos en tus propios proyectos.
De acuerdo. Encontré la solución aquí tessnet2 falla al cargar la respuesta dada por Adam
Aparentemente estaba usando la versión incorrecta de tessdata. Estaba siguiendo las instrucciones de la here intuitiva y eso causó el problema.
dice
Uso rápido de Tessnet2
Descargue el binario aquí , agregue una referencia del ensamblaje Tessnet2.dll a su proyecto .NET.
Descargue el archivo de definición de datos de idioma here y póngalo en el directorio tessdata. El directorio de Tessdata y su exe deben estar en el mismo directorio.
Después de descargar el archivo binario, cuando sigue el enlace para descargar el archivo de idioma, hay muchos archivos de idioma. Pero ninguno de ellos es la versión correcta. debe seleccionar todas las versiones y pasar a la página siguiente para obtener la versión correcta (tesseract-2.00.eng). Deben actualizar el enlace binario de descarga a la versión 3 o colocar el archivo de idioma de la versión 2 en la primera página. O al menos en negrita mencionar el hecho de que este problema de versión es un gran problema!
De todos modos lo encontré. Gracias a todos.
En mi caso tuve todos estos trabajos a excepción del reconocimiento de caracteres correcto.
Pero hay que tener en cuenta estas pocas cosas:
- Usa la librería tessnet2 correcta
- usar la versión correcta del idioma tessdata
- tessdata debe estar en algún lugar fuera de la carpeta de la aplicación donde puede colocar la ruta completa en el parámetro init. use
ocr.Init(@"c:/tessdata", "eng", true);
- La depuración le causará dolor de cabeza. Entonces necesitas actualizar tu app.config con esto. (No puedo poner el código xml aquí. Dame tu correo electrónico, te lo enviaré por correo electrónico)
espero que esto ayude
Esto me funcionó, tenía 3-4 más PDF a extractor de texto y si uno no funciona, el otro ... tesseract en particular, este código se puede usar en Windows 7, 8, Server 2008. Espero que esto te sea útil.
do
{
// Sleep or Pause the Thread for 1 sec, if service is running too fast...
Thread.Sleep(millisecondsTimeout: 1000);
Guid tempGuid = ToSeqGuid();
string newFileName = tempGuid.ToString().Split(''-'')[0];
string outputFileName = appPath + "//pdf2png//" + fileNameithoutExtension + "-" + newFileName +
".png";
extractor.SaveCurrentImageToFile(outputFileName, ImageFormat.Png);
// Create text file here using Tesseract
foreach (var file in Directory.GetFiles(appPath + "//pdf2png"))
{
try
{
var pngFileName = Path.GetFileNameWithoutExtension(file);
string[] myArguments =
{
"/C tesseract ", file,
" " + appPath + "//png2text//" + pngFileName
}; // /C for closing process automatically whent completes
string strParam = String.Join(" ", myArguments);
var myCmdProcess = new Process();
var theProcess = new ProcessStartInfo("cmd.exe", strParam)
{
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
WindowStyle = ProcessWindowStyle.Minimized
}; // Keep the cmd.exe window minimized
myCmdProcess.StartInfo = theProcess;
myCmdProcess.Exited += myCmdProcess_Exited;
myCmdProcess.Start();
//if (process)
{
/*
MessageBox.Show("cmd.exe process started: " + Environment.NewLine +
"Process Name: " + myCmdProcess.ProcessName +
Environment.NewLine + " Process Id: " + myCmdProcess.Id
+ Environment.NewLine + "process.Handle: " +
myCmdProcess.Handle);
*/
Process.EnterDebugMode();
//ShowWindow(hWnd: process.Handle, nCmdShow: 2);
/*
MessageBox.Show("After EnterDebugMode() cmd.exe process Exited: " +
Environment.NewLine +
"Process Name: " + myCmdProcess.ProcessName +
Environment.NewLine + " Process Id: " + myCmdProcess.Id
+ Environment.NewLine + "process.Handle: " +
myCmdProcess.Handle);
*/
myCmdProcess.WaitForExit(60000);
/*
MessageBox.Show("After WaitForExit() cmd.exe process Exited: " +
Environment.NewLine +
"Process Name: " + myCmdProcess.ProcessName +
Environment.NewLine + " Process Id: " + myCmdProcess.Id
+ Environment.NewLine + "process.Handle: " +
myCmdProcess.Handle);
*/
myCmdProcess.Refresh();
Process.LeaveDebugMode();
//myCmdProcess.Dispose();
/*
MessageBox.Show("After LeaveDebugMode() cmd.exe process Exited: " +
Environment.NewLine);
*/
}
//process.Kill();
// Waits for the process to complete task and exites automatically
Thread.Sleep(millisecondsTimeout: 1000);
// This works fine in Windows 7 Environment, and not in Windows 8
// Try following code block
// Check, if process is not comletey exited
if (!myCmdProcess.HasExited)
{
//process.WaitForExit(2000); // Try to wait for exit 2 more seconds
/*
MessageBox.Show(" Process of cmd.exe was exited by WaitForExit(); Method " +
Environment.NewLine);
*/
try
{
// If not, then Kill the process
myCmdProcess.Kill();
//myCmdProcess.Dispose();
//if (!myCmdProcess.HasExited)
//{
// myCmdProcess.Kill();
//}
MessageBox.Show(" Process of cmd.exe exited ( Killed ) successfully " +
Environment.NewLine);
}
catch (System.ComponentModel.Win32Exception ex)
{
MessageBox.Show(
" Exception: System.ComponentModel.Win32Exception " +
ex.ErrorCode + Environment.NewLine);
}
catch (NotSupportedException notSupporEx)
{
MessageBox.Show(" Exception: NotSupportedException " +
notSupporEx.Message +
Environment.NewLine);
}
catch (InvalidOperationException invalidOperation)
{
MessageBox.Show(
" Exception: InvalidOperationException " +
invalidOperation.Message + Environment.NewLine);
foreach (
var textFile in Directory.GetFiles(appPath + "//png2text", "*.txt",
SearchOption.AllDirectories))
{
loggingInfo += textFile +
" In Reading Text from generated text file by Tesseract " +
Environment.NewLine;
strBldr.Append(File.ReadAllText(textFile));
}
// Delete text file after reading text here
Directory.GetFiles(appPath + "//pdf2png").ToList().ForEach(File.Delete);
Directory.GetFiles(appPath + "//png2text").ToList().ForEach(File.Delete);
}
}
}
catch (Exception exception)
{
MessageBox.Show(
" Cought Exception in Generating image do{...}while{...} function " +
Environment.NewLine + exception.Message + Environment.NewLine);
}
}
// Delete png image here
Directory.GetFiles(appPath + "//pdf2png").ToList().ForEach(File.Delete);
Thread.Sleep(millisecondsTimeout: 1000);
// Read text from text file here
foreach (var textFile in Directory.GetFiles(appPath + "//png2text", "*.txt",
SearchOption.AllDirectories))
{
loggingInfo += textFile +
" In Reading Text from generated text file by Tesseract " +
Environment.NewLine;
strBldr.Append(File.ReadAllText(textFile));
}
// Delete text file after reading text here
Directory.GetFiles(appPath + "//png2text").ToList().ForEach(File.Delete);
} while (extractor.GetNextImage()); // Advance image enumeration...
Intente actualizar la línea para:
ocr.Init (@ "C: /", "eng", falso); // la ruta aquí debería ser la carpeta principal de tessdata
Pude hacerlo funcionar siguiendo estas instructions .
Descarga el código de muestra
Descomprimirlo en una nueva ubicación.
Abra ~ / tesseract-samples-master / src / Tesseract.Samples.sln (usé Visual Studio 2017)
Instale el paquete Tesseract NuGet para ese proyecto (o desinstálelo / reinstálelo como tenía que hacerlo)
Descomente las dos últimas líneas significativas en Tesseract.Samples.Program.cs:
Console.Write("Press any key to continue . . . "); Console.ReadKey(true);
Console.Write("Press any key to continue . . . "); Console.ReadKey(true);
Corre (pulsa F5)
Tuve el mismo problema, ahora está resuelto. Tengo tesseract2, en estas carpetas para 32 y 64 bits, copié los archivos de 64 bits (ya que mi sistema es de 64 bits) en la carpeta principal ("Tesseract2") y en la carpeta bin / Debug. Ahora mi solución está funcionando bien.
Un ejemplo simple de probar Tesseract OCR en C #:
public static string GetText(Bitmap imgsource)
{
var ocrtext = string.Empty;
using (var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default))
{
using (var img = PixConverter.ToPix(imgsource))
{
using (var page = engine.Process(img))
{
ocrtext = page.GetText();
}
}
}
return ocrtext;
}
Información: la carpeta tessdata debe existir en el repositorio: bin / Debug /