OCR библиотека для Java: компиляция tesseract на Windows 64-бит


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

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

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

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

UPDATE: я пытался использовать tesjeract, но когда я выполняю свое приложение, оно падает из-за

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

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

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 3

3 ответа:

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

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

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