Exemplo simples de Tesseract OCR
Tentei a demo encontrada aqui. Descarreguei o conjunto de dados inglês e abri O fecho na unidade C. e modificou o código da seguinte forma:
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);
Infelizmente, o código não funciona. o programa morre em " ocr.Inicial(..." linha. Nem sequer consegui abrir uma excepção, mesmo usando o "tentar apanhar".
consegui executar o vietocr! mas esse é um projeto muito grande para eu seguir. eu preciso um exemplo simples como o acima.
Obrigado.8 answers
Utilização Rápida do Tessnet2
Transferir o binário aqui , adicionar uma referência do conjunto Tessnet2.fale com o seu Projecto. Net.
Obter os dados da língua ficheiro de definição aqui e coloca-o na pasta tessdata. O directório Tessdata e o seu exe devem estar no o mesmo directório.
Depois de baixar o binário, quando você segue o link para baixar o arquivo do idioma, há muitos arquivos de linguagem. mas nenhum deles é a versão certa. você precisa selecionar toda a versão e ir para a próxima página para a versão correta (tesseract-2.00.eng! Eles devem atualizar o link de download binário para a versão 3 ou colocar a versão 2 arquivo de idioma na primeira página. Ou, pelo menos, ousado mencionar o fato de que esta edição da versão é um grande negócio!
Seja como for, encontrei-o. Obrigado a todos.Um exemplo simples de testar Tesseract OCR em 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;
}
Informação: a pasta tessdata deve existir no repositório: bin\Debug\
Tente actualizar a linha para:
Ocr.Init (@"c:\", "eng", false); // a localização aqui deve ser a pasta-mãe do tessdata
Mas tens de considerar estas poucas coisas:
- usar a biblioteca tessnet2 correcta
- utilizar a versão linguística tessdata correcta
- tessdata deve estar em algum lugar fora da sua pasta de aplicação onde você pode colocar em um caminho completo no parâmetro init. utilizar
ocr.Init(@"c:\tessdata", "eng", true);
A depuração causa-lhe dores de cabeça. Então você precisa atualizar seu aplicativo.configuracao
usar. (I can't put the xml code aqui. dá - me o teu e-mail e eu mando-to por e-mail.
Aqui está um grande projecto de exemplo de trabalho; Tesseract OCR Sample (Visual Studio) com Leptonica pré-processamento Tesseract OCR Sample (Visual Studio) with Leptonica Preprocessing
A API Tesseract OCR 3.02.02 pode ser confusa, por isso isto orienta-o através da inclusão do Tesseract e da Leptonica dll num projecto C++ de estúdio Visual, e fornece um ficheiro de exemplo que toma um caminho de imagem para pré-processamento e OCR. O programa de pré-processamento em Leptonica converte a imagem de entrada em texto a preto e branco.
Configuração
Para incluir isto nos seus próprios projectos, terá de referenciar os ficheiros de cabeçalho e lib e copiar as pastas de tessdata e dlls.
Copia a pasta de inclusão do tesseract para a pasta raiz do seu projecto. Agora clique em seu projeto no Visual Studio Solution Explorer, e vá para Project>Properties.
As Pastas VC++ > incluem Directórios:
..\tesseract-include\tesseract;..\tesseract-include\leptonica;$(IncludePath) C / C++>Pré-Processador>Definições Do Pré-Processador:
_CRT_ SECURE_ NO_ warnings;%(pré-Processesordefinitions) C / C++>Linker>Input>Dependências Adicionais:
..\tesseract-include\libtesseract302.dado;..\tesseract-include\liblept168.lib;%(dependências adicionais) Agora você pode incluir cabeçalhos no arquivo do seu projeto:
Inclui
Inclui
Agora copia os dois. os ficheiros no tesseract-incluem e a pasta tessdata na depuração para a pasta de saída do seu projecto.Quando inicializar o tesseract, terá de indicar a localização da pasta-mãe (!importante) da pasta tessdata, se não for já a pasta actual do seu ficheiro executável. Você pode copiar meu script, que assume que tessdata está instalado na pasta do executável.
Tesseract:: TessBaseAPI * api = novo tesseract:: TessBaseAPI (); api->Init("D:\tessdataParentFolder\", ... Amostra
Você pode compilar a amostra fornecida, que leva um argumento da linha de comandos do caminho da imagem a usar. A função preprocess() usa Leptonica para criar uma cópia em preto e branco da imagem que faz o tesseract funcionar com 90% de precisão. A função ocr () mostra a funcionalidade da API Tesseract para retornar uma saída de texto. A toClipboard () pode ser usada para gravar texto para a área de transferência no Windows. Você pode copiá-los em seus próprios projetos.
Consegui que funcionasse seguindo estas instruções .
Obter o código da amostra
Abre-o para uma nova localização
Abrir ~\tesseract-samples-master\src\Tesseract.Exemplo.sln (I used Visual Studio 2017)
Instalar o pacote 'Tesseract NuGet' para esse projecto (ou desinstalar/reinstalar como tinha de ser)
Descomentar os dois últimos significantes linhas em Tesseract.Exemplo.Programa.cs:
Console.Write("Press any key to continue . . . "); Console.ReadKey(true);
Executar (hit F5)
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...