每像素字节数,每行字节数 - 如何在 tess-two 的 tessbaseapi.cpp 中使用函数 nativeSetImageBytes?

bytes per pixel, bytes per line - How to use function nativeSetImageBytes in tessbaseapi.cpp of tess-two?

我们正在解析显示文本片段的图像,其分辨率为 2121x105 像素。在 Java 中,我们有以下代码来获取字节数组(我们的限制之一是在此处使用字节数组):

import org.apache.commons.io.IOUtils;

...

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

这个字节数组然后被传递给本地 C++ 代码——我们没有使用 tess-two 的 Java 包装器,但是我们使用本地库。在本机代码中,我们试图获取 使用 GetUTF8Text() 的图像文本。然后我们看到tess-two已经有设置图片读取的实现,将图片作为字节数组传递:

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

...

我们认为 PNG 的 bpp 应该是 4 (RGBA)。目前尚不清楚 bpl 的预期内容。如果我们将图像的宽度设置为 bpp 的倍数,则会出现分割错误。如果我们将其设置为零,则会返回一个空字符串。

更新:GetUTF8Text() 而不是在 SetImage().

中抛出分割错误
SIGSEGV (signal SIGSEGV: invalid address (fault address: 0xc))

tess-two which uses tesseract OCR 需要 rgba rgb 或灰色格式的解码图像。

所以你需要解码你的 png(this 问题在 java 中解释了如何做)并将结果转换为字节数组。

bpp 是 rgba 格式每个像素的字节数,它将是 4(1 字节是红色 2 是绿色 3 是蓝色 4 是alpha) 对于 rgb 它将是 3(1 字节是红色 2 是绿色 3 是蓝色)对于灰度它将是 1。

bpl 是每行字节数 = bpp * 图像宽度