Я работаю над программой для извлечения китайских субтитров из видео. На последнем этапе моей программы используется библиотека Пресеты JavaCPP для Tesseract для распознавания текста.
TessBaseAPI api = new TessBaseAPI();
// Initialize tesseract-ocr with Simplified Chinese
if (api.Init(pathToTessdata, "chi_sim") != 0) {
System.err.println("Could not initialize tesseract.");
System.exit(1);
}
// Open input image with leptonica library
PIX image = pixRead(pathToInputImage);
api.SetImage(image);
// Get OCR result
BytePointer outText = api.GetUTF8Text();
String result = outText.getString();
Распознавание персонажа работает довольно хорошо, но Тессеракт иногда добавляет пробелы, где на изображении нет места. Примите во внимание следующую картину:
Правильный вывод будет 这么快就到了
, но Тессеракт отображает это как 这么快就到 了
. Я полагаю, что это потому, что символ 了 - кроме верхней горизонтальной линии - состоит только из одной вертикальной линии с большим количеством пустого пространства слева.
Я нашел двух людей, которые уже сталкивались с той же проблемой при использовании Tesseract с C ++: Tesseract Распознавание ложных пробелов и Как удержать Tesseract от вставки лишних пробелов в словах? . Решения предложили изменить настройку для tosp_min_sane_kn_sp
. Однако я не смог запустить его с Java.
Google тоже ничего не находит для javacpp tosp_min_sane_kn_sp
. Я пытался api.SetVariable("tosp_min_sane_kn_sp", "2.8");
, но безуспешно.
Я также пытался объявить, что мой шрифт моноширинный - как китайские иероглифы по определению моноширинный - но не мог понять, как это сделать. Кроме того, если в подзаголовке появилось несколько цифр, они не могут быть моноширинными.
Итак, мой вопрос: как изменить чувствительность Tesseract к пробелам с Java?
Кстати, простое удаление всех пробелов не вариант, так как некоторые субтитры содержат пробелы, например, между первым и вторым символом в этом тексте:
Если это помогает, пробелы обычно такие широкие, как на этом рисунке Любая помощь с благодарностью.