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

时间:2018-07-30 08:48:31

标签: java c++ java-native-interface tesseract tess-two

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

import org.apache.commons.io.IOUtils;

...

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

然后将这个字节数组传递给本机C ++代码-我们没有使用tess-2的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))

1 个答案:

答案 0 :(得分:1)

使用tess-two

tesseract OCR期望解码后的图像为rgba rgb或灰度格式。

因此,您需要解码png(this问题说明了如何在Java中执行此操作)并将结果转换为字节数组。

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

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