Библиотека OCR для Java: компиляция tesseract в 64-битной Windows - PullRequest
3 голосов
/ 01 октября 2011

Я использую ImageJ для обработки изображений документов (деловых документов) и ищу хорошую библиотеку OCR для извлечения текста из некоторых регионов.

В настоящее время я использую Asprise, но результаты не очень надежны. Определенные символы часто путаются (0 становится O, 8 -> B,% -> 0, ...), тогда есть пробел, где его не должно быть, и, следовательно, возникает много проблем при постобработке этих данных. Изображения имеют разрешение 1240x1754, более высокое разрешение я еще не пробовал, но самые маленькие символы, которые я хотел бы обнаружить, имеют высоту 15 пикселей, поэтому я предполагаю, что качество изображения достаточно. (кстати, я выполняю ocr на исходном изображении, а не на двоичном изображении)

Глядя на подобные вопросы, я заметил, что тессеракт часто рекомендуется. Поскольку он написан на C ++, я не уверен, как его использовать в Java и ImageJ.

Используя Asprise, который, насколько я знаю, также написан на c ++ и предлагает только оболочку Java, я могу выполнить ocr на основе BufferedImage. Так что я полагаю, что мог бы сделать то же самое с тессерактом.

1. Как я могу вызвать функции тессеракта из Java?

ОБНОВЛЕНИЕ: Я пытался использовать tesjeract, но когда я выполняю свое приложение, оно падает из-за

UnsatisfiedLinkError: C: \ Windows \ System32 \ tessdll.dll: не удается найти зависимые библиотеки

Я смог успешно скомпилировать tesjeract и tesseract 2.04 и поместил tessdll.dll и tesjeract.dll в c: \ windows \ system32. Я использую этот статический блок для загрузки библиотек:

static
{
    System.loadLibrary("tessdll");
    System.loadLibrary("tesjeract");
}

Если это актуально, я использую 64-разрядную версию Windows 7.


2. Так как же мне преобразовать BufferedImage в формат, с которым может работать tesseract?

решаемые

Это код, если кому-то интересно: (происходит от audiveris )

private ByteBuffer imageToTiffBuffer (BufferedImage image) throws IOException
{
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageOutputStream     ios = ImageIO.createImageOutputStream(baos);

    // Take the first suitable TIFF writer
    ImageWriter writer = ImageIO.getImageWritersByFormatName("tiff").next();
    writer.setOutput(ios);
    writer.write(image);
    ios.close();

    // allocate() doesn't work
    ByteBuffer buf = ByteBuffer.allocateDirect(baos.size());
    buf.put(baos.toByteArray());

    return buf;
}

Ответы [ 3 ]

2 голосов
/ 15 октября 2011

битность внешних библиотек должна совпадать с вашей JVM. Так как tesjeract является наименьшим общим знаменателем, вам нужно использовать 32-битную JVM.

1 голос
/ 01 октября 2011

Существует два Java-обертки для Tesseract 2.04, которые вы можете посмотреть: Tess4J и Tesjeract .

1 голос
/ 01 октября 2011

Вы можете взглянуть на audiveris , пакет Java OMR, который, как мне кажется, использует Tesseract для текстовых частей листов.

...