Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何限制识别结果?_Java_Android_Ocr_Tesseract_Leptonica - Fatal编程技术网

Java 如何限制识别结果?

Java 如何限制识别结果?,java,android,ocr,tesseract,leptonica,Java,Android,Ocr,Tesseract,Leptonica,如何限制Tesseract和Leptonica库的结果, 我希望Tesseract限制结果: 仅取8位数字,从字母D开始计算 不要使用小写、回车、空格和符号 只接受大写字母和数字。 例如: 识别结果为asn*&bhDK 1234 UDaks&%^jdg,然后简单地取为DK1234UD。 所以,不要拿低盒子,进入,空格。只考虑追逐和数字。 我使用Java源代码 这是识别码: TessBaseAPI baseApi = new TessBaseAPI(); baseApi.setPa

如何限制Tesseract和Leptonica库的结果, 我希望Tesseract限制结果:

仅取8位数字,从字母D开始计算 不要使用小写、回车、空格和符号 只接受大写字母和数字。 例如: 识别结果为asn*&bhDK 1234 UDaks&%^jdg,然后简单地取为DK1234UD。 所以,不要拿低盒子,进入,空格。只考虑追逐和数字。 我使用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]", " ");
    }
谁能告诉我怎么做?这里应该添加什么?

如果使用TessBaseAPI实例,可以使用常量VAR\u CHAR\u WHITELIST调用setVariable

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

String whiteList = "DK1234567890";
如果需要,您可能仍然需要对结果执行更多的字符串操作, 例如,根据您的示例,从结果末尾删除字母 您可以使用第二个whilteList获得此结果

DK1234UD
编辑:

从:DK123455UD获取结果 可以使用子字符串

String result = "DK123455UD";
int pos = result.indexOf("DK");
String finalResult = result.substring(pos,pos+8);
编辑: 像这样

如果使用TessBaseAPI实例,则可以使用常量VAR\u CHAR\u WHITELIST调用setVariable

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

String whiteList = "DK1234567890";
如果需要,您可能仍然需要对结果执行更多的字符串操作, 例如,根据您的示例,从结果末尾删除字母 您可以使用第二个whilteList获得此结果

DK1234UD
编辑:

从:DK123455UD获取结果 可以使用子字符串

String result = "DK123455UD";
int pos = result.indexOf("DK");
String finalResult = result.substring(pos,pos+8);
编辑: 像这样


Thx发送给@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]"," ");

        }

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

谢谢@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]"," ");

        }

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

字母绝对是DK。DK后面的字母不是固定的。所以,有时在字母DK之后是1234UD,或4369CU,或0987BA。是的,这就是为什么我告诉你,你需要操纵最终结果来得到你想要的,也许应用一些正则表达式来提取模式,从DK开始,然后是任何数字,这就是你需要做的,如果白名单根据你的问题给出了你需要的:*只取8位数字,从字母D开始计算**,那么在最终结果中,获取indexOfDK;子串8位…但怎么能做到呢?你能用java代码告诉我吗?请实际上,我在代码中添加了setVariable,请看上面的内容。但现在,如何限制只有8位的结果从字母Dletters开始,这肯定是DK。DK后面的字母不是固定的。所以,有时在字母DK之后是1234UD,或4369CU,或0987BA。是的,这就是为什么我告诉你,你需要操纵最终结果来得到你想要的,也许应用一些正则表达式来提取模式,从DK开始,然后是任何数字,这就是你需要做的,如果白名单根据你的问题给出了你需要的:*只取8位数字,从字母D开始计算**,那么在最终结果中,获取indexOfDK;子串8位…但怎么能做到呢?你能用java代码告诉我吗?请实际上,我在代码中添加了setVariable,请看上面的内容。但现在,如何限制从字母D开始的结果只有8位