Как использовать функцию nativeSetImageBytes в tessbaseapi.cpp из tess-two?

мы анализируем изображение, показывающее текстовую куклу с разрешением 2121×105 пикселей. В Java у нас есть следующий код для получения байтового массива (одним из наших ограничений является работа с байтовым массивом здесь):

import org.apache.commons.io.IOUtils;

...

InputStream is = getAssets().open("images/text.png");
byte[] bytes = IOUtils.toByteArray(is);

Этот байтовый массив затем передается в собственный код C ++ — мы не используем Java-оболочку tess-two, но мы используем собственные библиотеки. В нативном коде мы пытаемся получить
текст изображения с GetUTF8Text (). Затем мы увидели, что у tess-two уже есть реализация для установки изображения для чтения, передавая его как байтовый массив:

void Java_com_..._TessBaseAPI_nativeSetImageBytes(JNIEnv *env,
jobject thiz,
jlong mNativeData,
jbyteArray data,
jint width,
jint height,
jint bpp,
jint bpl) {

...

Мы поняли, что BPP для PNG должно быть 4 (RGBA). Пока не ясно, что ожидается для место рождения. Если мы установим ширину изображения, умноженную на BPP тогда мы получаем ошибку сегментации. Если мы установим его на ноль, возвращается пустая строка.

ОБНОВИТЬ:
Ошибка полугентации GetUTF8Text () и не в SetImage ().

SIGSEGV (signal SIGSEGV: invalid address (fault address: 0xc))

1

Решение

tess-two который использует tesseract OCR ожидает декодированное изображение в формате rgba rgb или grey.

Так что нужно расшифровать свой png (этот Вопрос объясняет, как это сделать в Java) и преобразовать результат в байтовый массив.

BPP в байтах на пиксель для формата rgba это будет 4 (1 байт — красный 2 — зеленый 3 — синий 4 — альфа) для rgb — 3 (1 байт — красный 2 — зеленый 3 — синий) для шкалы серого — 1 ,

место рождения это байты на строку = bpp * ширина изображения

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]