По моему опыту, библиотеки OCR обычно выводят текст, найденный внутри изображения, но не там, где был найден текст. Есть ли библиотека OCR, которая выводит как слова, найденные внутри изображения, так и координаты (x, y, width, height
), где были найдены эти слова?
Есть ли библиотека OCR, которая выводит координаты слов, найденных внутри изображения?
Ответ 1
Большинство коммерческих механизмов OCR будут возвращать координаты слов и символов, но вам придется работать с их SDK для извлечения информации. Даже Tesseract OCR вернет информацию о местоположении, но добраться до нее было нелегко. Версия 3.01 станет проще, но интерфейс DLL все еще работает.
К сожалению, большинство бесплатных программ OCR используют Tesseract OCR в своей базовой форме, и они сообщают только необработанные результаты ASCII.
www.transym.com - Transym OCR - выводит координаты. www.rerecognition.com - движок KADMOS возвращает координаты.
Также Caere Omnipage, Mitek, Abbyy, Charactell возвращают позиции персонажей.
Ответ 2
Я использую TessNet (обертка Tesseract С#), и я получаю координаты слов со следующим кодом:
TextWriter tw = new StreamWriter(@"U:\user files\bwalker\ocrTesting.txt");
Bitmap image = new Bitmap(@"u:\user files\bwalker\2849257.tif");
tessnet2.Tesseract ocr = new tessnet2.Tesseract();
// If digit only
ocr.SetVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.,$-/#&=()\"':?");
// To use correct tessdata
ocr.Init(@"C:\Users\bwalker\Documents\Visual Studio 2010\Projects\tessnetWinForms\tessnetWinForms\bin\Release\", "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 files\bwalker\ocrTesting2.txt", true))
{
writer.WriteLine(Results);//+", "+word.Top+", "+word.Bottom+", "+word.Left+", "+word.Right);
writer.Close();
}
MessageBox.Show("Completed");
Ответ 3
Вы также можете взглянуть на структуру Gamera (http://gamera.informatik.hsnr.de/), это набор инструментов, который позволяет вам создавать собственные OCR. Тем не менее самым быстрым способом является использование вывода Tesseract или OCRopus hOCR (http://en.wikipedia.org/wiki/HOCR.
Ответ 4
Вы можете использовать hocr
с tesseract так:
tesseract syllabus-page1.jpg syllabus-page1 hocr
Это выведет в основном документ HTML5 с такими элементами, как:
<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>
Хотя я уверен, что не то, как вы должны использовать XML, мне было проще, чем копаться в API tesseract.
P.S. Я понимаю, что несколько комментариев и ответов ссылаются на это решение, но ни один из них на самом деле не показывает, как использовать параметр hocr
или описывать вывод, который вы получаете от него.
Ответ 5
Google Vision API делает это. https://cloud.google.com/vision/docs/detecting-text
"description": "Wake up human!\n",
"boundingPoly": {
"vertices": [
{
"x": 29,
"y": 394
},
{
"x": 570,
"y": 394
},
{
"x": 570,
"y": 466
},
{
"x": 29,
"y": 466
}
]
}
Ответ 6
Для разработчиков Java:
Я рекомендую вам использовать Tesseract и Tess4j.
Фактически вы можете найти пример того, как найти слова в изображении в одном из тестов Tess4j.
public void testResultIterator() throws Exception {
logger.info("TessBaseAPIGetIterator");
File tiff = new File(this.testResourcesDataPath, "eurotext.tif");
BufferedImage image = ImageIO.read(new FileInputStream(tiff)); // require jai-imageio lib to read TIFF
ByteBuffer buf = ImageIOHelper.convertImageData(image);
int bpp = image.getColorModel().getPixelSize();
int bytespp = bpp / 8;
int bytespl = (int) Math.ceil(image.getWidth() * bpp / 8.0);
api.TessBaseAPIInit3(handle, datapath, language);
api.TessBaseAPISetPageSegMode(handle, TessPageSegMode.PSM_AUTO);
api.TessBaseAPISetImage(handle, buf, image.getWidth(), image.getHeight(), bytespp, bytespl);
ETEXT_DESC monitor = new ETEXT_DESC();
TimeVal timeout = new TimeVal();
timeout.tv_sec = new NativeLong(0L); // time > 0 causes blank ouput
monitor.end_time = timeout;
ProgressMonitor pmo = new ProgressMonitor(monitor);
pmo.start();
api.TessBaseAPIRecognize(handle, monitor);
logger.info("Message: " + pmo.getMessage());
TessResultIterator ri = api.TessBaseAPIGetIterator(handle);
TessPageIterator pi = api.TessResultIteratorGetPageIterator(ri);
api.TessPageIteratorBegin(pi);
logger.info("Bounding boxes:\nchar(s) left top right bottom confidence font-attributes");
int level = TessPageIteratorLevel.RIL_WORD;
// int height = image.getHeight();
do {
Pointer ptr = api.TessResultIteratorGetUTF8Text(ri, level);
String word = ptr.getString(0);
api.TessDeleteText(ptr);
float confidence = api.TessResultIteratorConfidence(ri, level);
IntBuffer leftB = IntBuffer.allocate(1);
IntBuffer topB = IntBuffer.allocate(1);
IntBuffer rightB = IntBuffer.allocate(1);
IntBuffer bottomB = IntBuffer.allocate(1);
api.TessPageIteratorBoundingBox(pi, level, leftB, topB, rightB, bottomB);
int left = leftB.get();
int top = topB.get();
int right = rightB.get();
int bottom = bottomB.get();
/******************************************/
/* COORDINATES AND WORDS ARE PRINTED HERE */
/******************************************/
System.out.print(String.format("%s %d %d %d %d %f", word, left, top, right, bottom, confidence));
// logger.info(String.format("%s %d %d %d %d", str, left, height - bottom, right, height - top)); //
// training box coordinates
IntBuffer boldB = IntBuffer.allocate(1);
IntBuffer italicB = IntBuffer.allocate(1);
IntBuffer underlinedB = IntBuffer.allocate(1);
IntBuffer monospaceB = IntBuffer.allocate(1);
IntBuffer serifB = IntBuffer.allocate(1);
IntBuffer smallcapsB = IntBuffer.allocate(1);
IntBuffer pointSizeB = IntBuffer.allocate(1);
IntBuffer fontIdB = IntBuffer.allocate(1);
String fontName = api.TessResultIteratorWordFontAttributes(ri, boldB, italicB, underlinedB, monospaceB,
serifB, smallcapsB, pointSizeB, fontIdB);
boolean bold = boldB.get() == TRUE;
boolean italic = italicB.get() == TRUE;
boolean underlined = underlinedB.get() == TRUE;
boolean monospace = monospaceB.get() == TRUE;
boolean serif = serifB.get() == TRUE;
boolean smallcaps = smallcapsB.get() == TRUE;
int pointSize = pointSizeB.get();
int fontId = fontIdB.get();
logger.info(String.format(" font: %s, size: %d, font id: %d, bold: %b,"
+ " italic: %b, underlined: %b, monospace: %b, serif: %b, smallcap: %b", fontName, pointSize,
fontId, bold, italic, underlined, monospace, serif, smallcaps));
} while (api.TessPageIteratorNext(pi, level) == TRUE);
assertTrue(true);
}
Ответ 7
ABCocr.NET(наш компонент) позволит вам получить координаты каждого найденного слова. Значения доступны через свойство Word.Bounds, которое просто возвращает System.Drawing.Rectangle.
В приведенном ниже примере показано, как вы можете распознать изображение с помощью ABCocr.NET и вывести необходимую информацию:
using System;
using System.Drawing;
using WebSupergoo.ABCocr3;
namespace abcocr {
class Program {
static void Main(string[] args) {
Bitmap bitmap = (Bitmap)Bitmap.FromFile("example.png");
Ocr ocr = new Ocr();
ocr.SetBitmap(bitmap);
foreach (Word word in ocr.Page.Words) {
Console.WriteLine("{0}, X: {1}, Y: {2}, Width: {3}, Height: {4}",
word.Text,
word.Bounds.X,
word.Bounds.Y,
word.Bounds.Width,
word.Bounds.Height);
}
}
}
}
Раскрытие информации: отправлено членом команды WebSupergoo.
Ответ 8
hocr является одним из выходных форматов Tesseract OCR engine, который имеет как слово, так и его координаты, а также имеет дополнительную информацию, такую как уверенный уровень распознавания слов.
Ответ 9
Свободный OCR.space API OCR возвращает координаты слов после установки параметра isOverlayRequired = true
:
"ParsedResults" : [
{
"TextOverlay" : {
"Lines" : [
{
"Words": [
{
"WordText": "Word 1",
"Left": 106,
"Top": 91,
"Height": 9,
"Width": 11
},
{
"WordText": "Word 2",
"Left": 121,
"Top": 90,
"Height": 13,
"Width": 51
}
.