【问题标题】:How to limit the results of recognition?如何限制识别结果?
【发布时间】:2014-10-02 06:54:30
【问题描述】:

如何限制tess-two的结果(Tesseract和Leptonica库),
我希望 Tesseract 限制结果:

  1. 只取 8 位数字,从字母 D 计算
  2. 不要使用小写、回车、空格和符号
  3. 只取大写和数字。

例如:
识别结果为"asn*&bhDK 1234 UDaks&%^jdg",则简单取为"DK1234UD"。
所以,不要拿LowerChase、Enter、Space。只取 UperChase 和数字。

我使用 Java 源代码

这是识别码:

    TessBaseAPI baseApi = new TessBaseAPI();
    baseApi.setPageSegMode(TessBaseAPI.OEM_TESSERACT_CUBE_COMBINED);
    baseApi.setPageSegMode(PageSegMode.PSM_AUTO_OSD);
    baseApi.setPageSegMode(PageSegMode.PSM_SINGLE_LINE);
    baseApi.setDebug(true);
    baseApi.init(DATA_PATH, lang);
    //setImage
    baseApi.setImage(bmpOtsu);
    //set whitelist
    String whitelist = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    baseApi.setVariable(TessBaseAPI.VAR_CHAR_WHITELIST, whitelist);
    //variable for recognizing      
    String recognizedText = baseApi.getUTF8Text();
    String resultTxt = recognizedText;
    baseApi.end();

    if ( lang.equalsIgnoreCase("eng") ) {
        recognizedText = recognizedText.replaceAll("[^A-Z0-9]", " ");
    }

谁能告诉我该怎么做?这里应该添加什么?

【问题讨论】:

    标签: java android ocr tesseract leptonica


    【解决方案1】:

    如果你使用TessBaseAPI的实例,你可以用常量VAR_CHAR_WHITELIST调用setVariable()

    String whiteList = "ABCD...XYZ1234567890";
    tessBaseApi.setVariable(TessBaseAPI.VAR_CHAR_WHITELIST,whiteList);
    

    您可以根据需要调整白名单 所以如果你想忽略除 D 和 K 之外的所有其他字母,请设置它:

    String whiteList = "DK1234567890";
    

    如果需要,您可能仍需要对结果进行更多的字符串操作, 就像根据您的示例从结果末尾删除字母 你可能会得到这个结果(使用第二个 whilteList)

    DK1234UD
    

    编辑:

    从 DK123455UD 获取结果 你可以使用 substring()

    String result = "DK123455UD";
    int pos = result.indexOf("DK");
    String finalResult = result.substring(pos,pos+8);
    

    编辑:
    喜欢这个?

        String whitelist = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        baseApi.setVariable(TessBaseAPI.VAR_CHAR_WHITELIST, whitelist);
        //setImage
        baseApi.setImage(bmpOtsu);
        //variable for recognizing      
        String recognizedText = baseApi.getUTF8Text();
        //
        int get8digits = recognizedText.indexOf("D");
        String resultTxt = recognizedText.substring(get8digits, get8digits+8);
    

    【讨论】:

    • 绝对是“DK”的字母。 “DK”后面的字母不固定。所以,有时在字母DK之后是1234UD,或4369CU,或0987BA。
    • 是的,这就是我告诉你的原因,你需要操纵最终结果以获得你想要的,也许应用一些正则表达式来提取模式以 DK 开头,后跟任何数字,这就是你需要的做,如果白名单给了你你需要的东西
    • 根据您的问题:**只取 8 位数字,从字母 D** 计算,所以在最终结果中,得到 indexOf("DK");和子串 8 位数字...
    • 但是怎么做呢?你能用java代码告诉我吗?请......真的很困惑
    • 我在我的代码中添加了setVariable,请看上面。但是现在,如何限制从字母“D”开始的只有8位结果
    【解决方案2】:

    感谢@Yazan 的回答,它的工作。
    我已经改进了答案。
    这是我的代码:

            TessBaseAPI baseApi = new TessBaseAPI();
        baseApi.setPageSegMode(TessBaseAPI.OEM_TESSERACT_CUBE_COMBINED);
        baseApi.setPageSegMode(PageSegMode.PSM_AUTO_OSD);
        baseApi.setPageSegMode(PageSegMode.PSM_SINGLE_LINE);
        baseApi.setDebug(true);
        baseApi.init(DATA_PATH, lang);
        //set variable
        String whiteList = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        String blackList = "\\s";
        baseApi.setVariable(TessBaseAPI.VAR_CHAR_WHITELIST, whiteList);
        baseApi.setVariable(TessBaseAPI.VAR_CHAR_BLACKLIST, blackList);
        //setImage
        //baseApi.setImage(bmpOtsu, w, h, 8, (Integer) null);
        baseApi.setImage(bmpOtsu);
        //variable for recognizing      
        String recognizedText = baseApi.getUTF8Text();
        recognizedText = recognizedText.replaceAll(blackList, "");//remove space
        String resultTxt = recognizedText;
        //
        baseApi.end();
    
        Log.v(TAG, "OCRED TEXT: " + recognizedText);
        if ( lang.equalsIgnoreCase("eng") ) {
            int get8digits = recognizedText.indexOf("D");
            String loop = recognizedText.substring(get8digits, recognizedText.length());
            if(recognizedText.contains("D") && loop.length() >= 8){
                Log.w(TAG, "OPSI 1"+"\n"+"Length: "+loop.length()+"\n"+"Values: "+loop);                
                recognizedText = recognizedText.substring(get8digits, get8digits+8);                                                
            }else if(recognizedText.contains("D") && loop.length() < 8){
                Log.w(TAG, "OPSI 2"+"\n"+"Length: "+loop.length()+"\n"+"Values: "+loop);
                recognizedText = loop;
            }else{
                Log.w(TAG, "OPSI 3"+"\n"+"Length: "+loop.length()+"\n"+"Values: "+loop);
                recognizedText = recognizedText.replaceAll("[A-Z0-9]"," ");
    
            }
    

    我希望这对任何人都有帮助。

    【讨论】:

      猜你喜欢
      • 2013-06-05
      • 2017-06-17
      • 2020-02-27
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      • 2016-11-23
      相关资源
      最近更新 更多