Я использую 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;
}