蓗乐 2022-03-22 21:03 采纳率: 66.7%
浏览 108
已结题

图片中文字定位识别tesseract如何增强文字框选范围呢?

在图片中查找文字定位查找到的定位乱七八糟,调了RIL_WORD以及RIL_TEXTLINE等等模式也不行

img

Box[1]:x=213,y=8,w=117,h=16,confidence:58,text:抗疫图片专栏姓名

像这种带连线的根本都分不开,要是能够达到腾讯QQ的文字识别效果就好了。
腾讯QQ的文字识别绝大多数都是可以做到把文字按一小块一小块的,它是如何做到的呢?

img

import net.sourceforge.tess4j.Tesseract;
import org.bytedeco.javacpp.BytePointer;
import org.bytedeco.leptonica.BOX;
import org.bytedeco.leptonica.BOXA;
import org.bytedeco.leptonica.PIX;
import org.bytedeco.tesseract.TessBaseAPI;
 
import java.io.File;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
import static org.bytedeco.leptonica.global.lept.*;
import static org.bytedeco.tesseract.global.tesseract.RIL_WORD;
 
public class imageUrl {
 
    public static void main(String[] args) throws Exception {
 
        BytePointer outtext;
 
        TessBaseAPI api = new TessBaseAPI();
 
        if (api.Init("tessdata", "zwp") != 0) {
 
            System.err.println("Could not initialalize tesseract");
 
            System.exit(0);
 
        }
        File file = new File("image.png");
 
        PIX image = pixRead(file.getAbsolutePath());
 
        image=pixConvertRGBToGrayFast(image);
 
        api.SetImage(image);
 
        int[] blockIds = {};
 
        long starttime = System.currentTimeMillis();
 
        BOXA boxes = api.GetComponentImages(RIL_WORD, true, null, blockIds);
 
        for (int i = 0; i < boxes.n(); i++) {
 
            BOX box = boxes.box(i);
 
            api.SetRectangle(box.x(), box.y(), box.w(), box.h());
 
            outtext = api.GetUTF8Text();
 
            String ocrresult = outtext.getString();
 
            int conf = api.MeanTextConf();
 
            String boxinformation = String.format("Box[%d]:x=%d,y=%d,w=%d,h=%d,confidence:%d,text:%s", i, box.x(),
                    box.y(), box.w(), box.h(), conf, ocrresult);
            System.out.println(boxinformation);
            outtext.deallocate();
        }
        api.End();
        pixDestroy(image);
        long invertaltime = System.currentTimeMillis() - starttime;
        System.out.println("识别用时:" + invertaltime);
    }
}
  • 写回答

6条回答 默认 最新

  • _雪菜肉丝面_ 2022-03-22 21:45
    关注
    获得1.70元问题酬金

    我的想法:
    1,腾讯强,而我们鸡。
    2,简单点的做法还是记录下文字的位置,然后识别。

    评论

报告相同问题?

问题事件

  • 系统已结题 3月30日
  • 创建了问题 3月22日

悬赏问题

  • ¥15 关于pycharm, Callable[[str],bool]作为方法参数使用时, lambda 类型不提示问题
  • ¥15 寻找了解qq家园纵横四海的程序猿。
  • ¥15 optisystem
  • ¥15 VB.NET画图时的撤销编程
  • ¥15 C# webservice 参数特殊字符处理
  • ¥15 关于控制时间更新的一个操作
  • ¥15 JAVA中使用poi创建word文件,实现页面边框环绕页眉
  • ¥15 matlibplot绘图图形切线问题
  • ¥15 flink 深度优先搜索
  • ¥15 python for everybody 使用Beautifulsoup构建soup对象的时候疯狂报错