代码之家  ›  专栏  ›  技术社区  ›  Alexander Belokon

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

  •  1
  • Alexander Belokon  · 技术社区  · 6 年前

    我们正在分析显示分辨率为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包装器,但是我们使用本地库。在本机代码中,我们试图获取 图像的文本 获取文本() . 然后我们看到tess 2已经有了一个实现,通过将图像作为字节数组传递来设置要读取的图像:

    void Java_com_..._TessBaseAPI_nativeSetImageBytes(JNIEnv *env,
                                                      jobject thiz,
                                                      jlong mNativeData,
                                                      jbyteArray data,
                                                      jint width,
                                                      jint height,
                                                      jint bpp,
                                                      jint bpl) {
    
    ...
    

    我们认为 bpp公司 对于PNG应该是4(RGBA)。但还不清楚预期的是什么 bpl公司 . 如果我们设置图像的宽度 bpp公司 然后我们得到一个分割错误。如果设置为零,则返回空字符串。

    更新: 汇编错误被抛出 获取文本() 而不是在 设置图像() .

    SIGSEGV (signal SIGSEGV: invalid address (fault address: 0xc))
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Dmitrii Z.    6 年前

    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*图像宽度