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

标签 java c++ java-native-interface tesseract 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 包装器,但是我们使用本地库。在 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/

相关文章:

java - 用泛型覆盖

c++ - C++0x 中的 Unicode 支持

c++ - 如何在 C++ 中实现与 unicode 无关的大小写不敏感比较

java - 为什么此重定向不起作用?日本科学基金会

java - 如何在 AfterMethod 中 TestNG 中测试失败?

java - 在 Java 中读取错误响应正文

c++ - 网络数据包创建/解析库?

java - android studio 中的 Opencv 不起作用?

android - 如何将 Java 与 NDK Android 一起使用?

java - 对于包含名为 "Node"的类的 JNI C++ 代码,JVM 无法按预期工作