open - ¿Cómo implementar y hacer OCR en un proyecto de C#?
tesseract ocr c# examples (5)
He estado buscando por un tiempo y todo lo que he visto algunas solicitudes de biblioteca OCR. Me gustaría saber cómo implementar la biblioteca de OCR más pura, fácil de instalar y usar con información detallada para la instalación en un proyecto de C #.
Si es posible, solo quiero implementarlo como una referencia habitual de dll ...
Ejemplo:
using org.pdfbox.pdmodel;
using org.pdfbox.util;
También sería bueno un pequeño ejemplo de código OCR, como:
public string OCRFromBitmap(Bitmap Bmp)
{
Bmp.Save(temppath, System.Drawing.Imaging.ImageFormat.Tiff);
string OcrResult = Analyze(temppath);
File.Delete(temppath);
return OcrResult;
}
Entonces, por favor, tenga en cuenta que no estoy familiarizado con los proyectos de OCR y dame una respuesta como hablar con un tonto.
Edit: supongo que la gente malentendió mi solicitud. Quería saber cómo implementar esas bibliotecas de código abierto de OCR en un proyecto de C # y cómo usarlas. El enlace dado como dup no da respuestas que solicité en absoluto.
Aquí hay uno: (visite http://hongouru.blogspot.ie/2011/09/c-ocr-optical-character-recognition.html o http://www.codeproject.com/Articles/41709/How-To-Use-Office-2007-OCR-Using-C para obtener más información
using MODI;
static void Main(string[] args)
{
DocumentClass myDoc = new DocumentClass();
myDoc.Create(@"theDocumentName.tiff"); //we work with the .tiff extension
myDoc.OCR(MiLANGUAGES.miLANG_ENGLISH, true, true);
foreach (Image anImage in myDoc.Images)
{
Console.WriteLine(anImage.Layout.Text); //here we cout to the console.
}
}
Estoy usando el motor de OCR tesseract con TessNet2 (un envoltorio de C # - http://www.pixel-technology.com/freeware/tessnet2/ ).
Algún código básico:
using tessnet2;
...
Bitmap image = new Bitmap(@"u:/user files/bwalker/2849257.tif");
tessnet2.Tesseract ocr = new tessnet2.Tesseract();
ocr.SetVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.,$-/#&=()/"'':?"); // Accepted characters
ocr.Init(@"C:/Users/bwalker/Documents/Visual Studio 2010/Projects/tessnetWinForms/tessnetWinForms/bin/Release/", "eng", false); // Directory of your tessdata folder
List<tessnet2.Word> result = ocr.DoOCR(image, System.Drawing.Rectangle.Empty);
string Results = "";
foreach (tessnet2.Word word in result)
{
Results += word.Confidence + ", " + word.Text + ", " + word.Left + ", " + word.Top + ", " + word.Bottom + ", " + word.Right + "/n";
}
Hay un contenedor de .NET para Tesseract 3.01: https://github.com/charlesw/tesseract-ocr-dotnet
Otra opción para esto es usar Neevia Document Converter que tiene capacidad incorporada de OCR. Puede ejecutar prácticamente cualquier tipo de archivo y producirá un pdf que es esencial para un gran documento de texto, que luego puede abrir y buscar utilizando ITextSharper
Si alguien está investigando esto, he estado probando diferentes opciones y el siguiente enfoque produce muy buenos resultados. Los siguientes son los pasos para obtener un ejemplo de trabajo:
- Agregue .NET Wrapper para tesseract a su proyecto. Se puede agregar a través del paquete NuGet
Install-Package Tesseract
( https://github.com/charlesw/tesseract ). - Vaya a la sección de Downloads del proyecto oficial de Tesseract ( Tesseract EDIT: ahora se encuentra aquí: https://github.com/tesseract-ocr/langdata ).
- Descargue los datos de idioma preferido, por ejemplo:
tesseract-ocr-3.02.eng.tar.gz English language data for Tesseract 3.02
. - Cree
tessdata
directorio detessdata
en su proyecto y coloque los archivos de datos de idioma en él. - Vaya a
Properties
de los archivos recién agregados y configúrelos para que se copien en la compilación. - Añadir una referencia a
System.Drawing
. - Desde el repositorio de .NET Wrapper, en el directorio de
Samples
, copie el archivophototest.tif
muestra en el directorio de su proyecto yphototest.tif
para que se copie en la compilación. - Cree los siguientes dos archivos en su proyecto (solo para comenzar):
Program.cs
using System;
using Tesseract;
using System.Diagnostics;
namespace ConsoleApplication
{
class Program
{
public static void Main(string[] args)
{
var testImagePath = "./phototest.tif";
if (args.Length > 0)
{
testImagePath = args[0];
}
try
{
var logger = new FormattedConsoleLogger();
var resultPrinter = new ResultPrinter(logger);
using (var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default))
{
using (var img = Pix.LoadFromFile(testImagePath))
{
using (logger.Begin("Process image"))
{
var i = 1;
using (var page = engine.Process(img))
{
var text = page.GetText();
logger.Log("Text: {0}", text);
logger.Log("Mean confidence: {0}", page.GetMeanConfidence());
using (var iter = page.GetIterator())
{
iter.Begin();
do
{
if (i % 2 == 0)
{
using (logger.Begin("Line {0}", i))
{
do
{
using (logger.Begin("Word Iteration"))
{
if (iter.IsAtBeginningOf(PageIteratorLevel.Block))
{
logger.Log("New block");
}
if (iter.IsAtBeginningOf(PageIteratorLevel.Para))
{
logger.Log("New paragraph");
}
if (iter.IsAtBeginningOf(PageIteratorLevel.TextLine))
{
logger.Log("New line");
}
logger.Log("word: " + iter.GetText(PageIteratorLevel.Word));
}
} while (iter.Next(PageIteratorLevel.TextLine, PageIteratorLevel.Word));
}
}
i++;
} while (iter.Next(PageIteratorLevel.Para, PageIteratorLevel.TextLine));
}
}
}
}
}
}
catch (Exception e)
{
Trace.TraceError(e.ToString());
Console.WriteLine("Unexpected Error: " + e.Message);
Console.WriteLine("Details: ");
Console.WriteLine(e.ToString());
}
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
private class ResultPrinter
{
readonly FormattedConsoleLogger logger;
public ResultPrinter(FormattedConsoleLogger logger)
{
this.logger = logger;
}
public void Print(ResultIterator iter)
{
logger.Log("Is beginning of block: {0}", iter.IsAtBeginningOf(PageIteratorLevel.Block));
logger.Log("Is beginning of para: {0}", iter.IsAtBeginningOf(PageIteratorLevel.Para));
logger.Log("Is beginning of text line: {0}", iter.IsAtBeginningOf(PageIteratorLevel.TextLine));
logger.Log("Is beginning of word: {0}", iter.IsAtBeginningOf(PageIteratorLevel.Word));
logger.Log("Is beginning of symbol: {0}", iter.IsAtBeginningOf(PageIteratorLevel.Symbol));
logger.Log("Block text: /"{0}/"", iter.GetText(PageIteratorLevel.Block));
logger.Log("Para text: /"{0}/"", iter.GetText(PageIteratorLevel.Para));
logger.Log("TextLine text: /"{0}/"", iter.GetText(PageIteratorLevel.TextLine));
logger.Log("Word text: /"{0}/"", iter.GetText(PageIteratorLevel.Word));
logger.Log("Symbol text: /"{0}/"", iter.GetText(PageIteratorLevel.Symbol));
}
}
}
}
FormattedConsoleLogger.cs
using System;
using System.Collections.Generic;
using System.Text;
using Tesseract;
namespace ConsoleApplication
{
public class FormattedConsoleLogger
{
const string Tab = " ";
private class Scope : DisposableBase
{
private int indentLevel;
private string indent;
private FormattedConsoleLogger container;
public Scope(FormattedConsoleLogger container, int indentLevel)
{
this.container = container;
this.indentLevel = indentLevel;
StringBuilder indent = new StringBuilder();
for (int i = 0; i < indentLevel; i++)
{
indent.Append(Tab);
}
this.indent = indent.ToString();
}
public void Log(string format, object[] args)
{
var message = String.Format(format, args);
StringBuilder indentedMessage = new StringBuilder(message.Length + indent.Length * 10);
int i = 0;
bool isNewLine = true;
while (i < message.Length)
{
if (message.Length > i && message[i] == ''/r'' && message[i + 1] == ''/n'')
{
indentedMessage.AppendLine();
isNewLine = true;
i += 2;
}
else if (message[i] == ''/r'' || message[i] == ''/n'')
{
indentedMessage.AppendLine();
isNewLine = true;
i++;
}
else
{
if (isNewLine)
{
indentedMessage.Append(indent);
isNewLine = false;
}
indentedMessage.Append(message[i]);
i++;
}
}
Console.WriteLine(indentedMessage.ToString());
}
public Scope Begin()
{
return new Scope(container, indentLevel + 1);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
var scope = container.scopes.Pop();
if (scope != this)
{
throw new InvalidOperationException("Format scope removed out of order.");
}
}
}
}
private Stack<Scope> scopes = new Stack<Scope>();
public IDisposable Begin(string title = "", params object[] args)
{
Log(title, args);
Scope scope;
if (scopes.Count == 0)
{
scope = new Scope(this, 1);
}
else
{
scope = ActiveScope.Begin();
}
scopes.Push(scope);
return scope;
}
public void Log(string format, params object[] args)
{
if (scopes.Count > 0)
{
ActiveScope.Log(format, args);
}
else
{
Console.WriteLine(String.Format(format, args));
}
}
private Scope ActiveScope
{
get
{
var top = scopes.Peek();
if (top == null) throw new InvalidOperationException("No current scope");
return top;
}
}
}
}