我们正在解析显示文本片段的图像,该图像的分辨率为 2121x105 像素。在 Java 中,我们有以下代码来获取字节数组(我们的限制之一是在此处使用字节数组):
import org.apache.commons.io.IOUtils;
...
InputStream is = getAssets().open("images/text.png");
byte[] bytes = IOUtils.toByteArray(is);
然后这个字节数组被传递给本地 C++ 代码——我们没有使用 tess-two 的 Java 包装器,但是我们使用本地库。在 native 代码中,我们试图获取 使用 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
使用 tesseract OCR
需要 rgba rgb 或灰色格式的解码图像。
因此您需要解码您的 png(this 问题解释了如何在 java 中执行此操作)并将结果转换为字节数组。
bpp 是每像素字节数,对于 rgba 格式它将是 4(1 字节是红色 2 是绿色 3 是蓝色 4 是 alpha)对于 rgb 它将是 3 (1 字节是红色,2 是绿色,3 是蓝色)对于灰度,它将是 1。
bpl 是每行字节数 = bpp * 图像宽度
关于java - 每像素字节数,每行字节数 - 如何在 tess-two 的 tessbaseapi.cpp 中使用函数 nativeSetImageBytes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51590161/