【发布时间】:2018-07-30 08:48:31
【问题描述】:
我们正在解析一个显示 textsn-p 的图像,其分辨率为 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))
【问题讨论】:
-
你需要先解码你的 png。
-
解码是什么意思?
-
我的意思是我说的。您的图像使用 libpng 编码,需要在 tesseract 使用之前进行解码。参见java示例here
-
好的,谢谢。我现在知道我需要解码我的 jbyteArray,但是当 nativeSetImageBytes 需要一个字节数组时,我会得到另一个对象类型。为了清楚起见,函数 nativeSetImageBytes 是 tess-two 的实现。
-
tess-two aka tesseract 需要 rgba rgb 或灰度格式的解码图像。所以你需要解码你的 png 并将结果转换为字节数组。 bpp 是 rgba 格式的每像素字节数,它将是 4(1 字节是红色 2 是绿色 3 是蓝色 4 是 alpha)对于 rgb 它将是 3(1 字节是红色 2 是绿色 3 是蓝色)对于灰度它将是1. bpl 是每行字节数 = bpp * 图像宽度
标签: java c++ java-native-interface tesseract tess-two