每个像素的字节数,每行的字节数 - 如何在 tess-two 的 tessbaseapi.cpp

我们正在解析显示分辨率为 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))


泛舟湖上清波郎朗
浏览 117回答 1
1回答

慕尼黑8549860

tess-two它使用tesseract OCRrgba rgb 或灰色格式的预期解码图像。所以你需要解码你的png(这个问题解释了如何在java中做到这一点)并将结果转换为字节数组。bpp是 rgba 格式的每像素字节数,它是 4(1 个字节是红色 2 是绿色 3 是蓝色 4 是 alpha)对于 rgb 它将是 3(1 个字节是红色 2 是绿色 3 是蓝色)对于灰度它将是1.bpl是每行字节数 = bpp * 图像宽度
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java