Solución:
La mayoría de los motores de OCR comerciales devolverán posiciones de coordenadas de palabras y caracteres, pero debe trabajar con sus SDK para extraer la información. Incluso Tesseract OCR devolverá información de posición, pero no ha sido fácil llegar a ella. La versión 3.01 lo hará más fácil, pero todavía se está trabajando en una interfaz DLL.
Desafortunadamente, la mayoría de los programas OCR gratuitos utilizan Tesseract OCR en su forma básica y solo informan los resultados ASCII sin procesar.
www.transym.com – Transym OCR – genera coordenadas. www.rerecognition.com – El motor KADMOS devuelve coordenadas.
También Caere Omnipage, Mitek, Abbyy, Charactell regresan posiciones de personajes.
Estoy usando TessNet (un contenedor de Tesseract C #) y obtengo coordenadas de palabras con el siguiente código:
TextWriter tw = new StreamWriter(@"U:user filesbwalkerocrTesting.txt");
Bitmap image = new Bitmap(@"u:user filesbwalker2849257.tif");
tessnet2.Tesseract ocr = new tessnet2.Tesseract();
// If digit only
ocr.SetVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.,$-/#&=()"':?");
// To use correct tessdata
ocr.Init(@"C:UsersbwalkerDocumentsVisual Studio 2010ProjectstessnetWinFormstessnetWinFormsbinRelease", "eng", false);
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.Top+", "+word.Bottom+", "+word.Left+", "+word.Right+"n";
}
using (StreamWriter writer = new StreamWriter(@"U:user filesbwalkerocrTesting2.txt", true))
{
writer.WriteLine(Results);//+", "+word.Top+", "+word.Bottom+", "+word.Left+", "+word.Right);
writer.Close();
}
MessageBox.Show("Completed");
Puedes usar el hocr
“configfile” con tesseract así:
tesseract syllabus-page1.jpg syllabus-page1 hocr
Esto generará un documento principalmente HTML5 con elementos como:
<div class="ocr_page" id='page_1' title="image "syllabus-page1.jpg"; bbox 0 0 2531 3272; ppageno 0">
<div class="ocr_carea" id="block_1_4" title="bbox 265 1183 2147 1778">
<p class="ocr_par" dir="ltr" id="par_1_8" title="bbox 274 1305 655 1342">
<span class="ocr_line" id="line_1_14" title="bbox 274 1305 655 1342; baseline -0.005 0; x_size 46.378059; x_descenders 10.378059; x_ascenders 12">
<span class="ocrx_word" id="word_1_78" title="bbox 274 1307 386 1342; x_wconf 90" lang="eng" dir="ltr">needs</span>
<span class="ocrx_word" id="word_1_79" title="bbox 402 1318 459 1342; x_wconf 90" lang="eng" dir="ltr">are</span>
<span class="ocrx_word" id="word_1_80" title="bbox 474 1305 655 1341; x_wconf 86" lang="eng" dir="ltr">different:</span>
</span>
</p>
...
</div>
...
</div>
Si bien estoy bastante seguro de que no es así como se supone que debes usar XML, lo encontré más fácil que profundizar en la API de tesseract.
PD: Me doy cuenta de que varios comentarios y respuestas aluden a esta solución, pero ninguno de ellos muestra realmente cómo usar el hocr
opción o describe el resultado que obtienes de eso.