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 ответа:
Разрядность внешних библиотек должна соответствовать вашей JVM. Поскольку tesjeract является наименьшим общим знаменателем, вам нужно будет использовать 32-битный JVM.
Вы можете посмотреть на audiveris, пакет JAVA OMR, который, как я полагаю, использует Tesseract для текстовых частей листов.