Java菜鳥淺談OCR


什么是OCR?

粗暴點說就是圖片文本識別!正規點的說法就是:(Optical Character Recognition,光學電子識別)

最近公司開展新項目,考慮到實名認證這方面,然后還要上傳身份證正反面,這就會涉及到一個問題,就是填寫的身份證號,跟圖片的身份證號對不上,或者我的圖片是瞎上傳的那種,那應該怎么辦?

那只能使用圖片文本識別就是所謂的OCR!

有很多種方法可以實現,比如人民幣玩家的可以接第三方:聚合、阿里、騰訊.......等等眾多平台都有相關的方案,

平民玩家的,也有插件:tesseract 但是需要翻牆下載,我這兩天翻不了牆,我就不試了,百度大把大把的教程,但是平民玩家會麻煩一點,這是肯定的,我思考了一下,還是用第三方的吧,簡單粗暴點

我選擇的是聚合數據OCR,https://www.juhe.cn/docs/api/id/287

 

步驟如下:

1)注冊聚合數據賬號

2)實名認證(我是拿公司的資料去認證的)

3)申請OCR(首次會有10次贈送)

4)獲取圖片轉base64

5)請求一下接口就行了,就那么簡單

直接上代碼吧:

/**
     * 獲取網絡圖片
     * @param imageUrl 圖片URL
     * @return
     * @throws Exception
     */
    public static String getURLImage(String imageUrl) throws Exception {  
        //new一個URL對象  
        URL url = new URL(imageUrl);  
        //打開鏈接  
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();  
        //設置請求方式為"GET"  
        conn.setRequestMethod("GET");  
        //超時響應時間為30秒  
        conn.setConnectTimeout(30 * 1000);  
        //通過輸入流獲取圖片數據  
        InputStream inStream = conn.getInputStream();  
        //得到圖片的二進制數據,以二進制封裝得到數據,具有通用性  
        byte[] data = readInputStream(inStream);  
        // 轉碼
        BASE64Encoder encode = new BASE64Encoder();  
        String s = encode.encode(data);  
        return s;  
    }  
    
    /**
     * 已二進制去封裝圖片
     * @param inStream 數據流
     * @return
     * @throws Exception
     */
    private static byte[] readInputStream(InputStream inStream) throws Exception{  
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();  
        //創建一個Buffer字符串  
        byte[] buffer = new byte[1024];  
        //每次讀取的字符串長度,如果為-1,代表全部讀取完畢  
        int len = 0;  
        //使用一個輸入流從buffer里把數據讀取出來  
        while( (len=inStream.read(buffer)) != -1 ){  
            //用輸出流往buffer里寫入數據,中間參數代表從哪個位置開始讀,len代表讀取的長度  
            outStream.write(buffer, 0, len);  
        }  
        //關閉輸入流  
        inStream.close();  
        //把outStream里的數據寫入內存  
        return outStream.toByteArray();  
    }

以上代碼,是用於獲取圖片並且轉成base64的

測試代碼

public static void main(String[] args) throws Exception {
        // 獲取圖片base64
        String base64str = getURLImage("https://www.wobokeji.com/justgoFile/upload/image/1.jpg");
//        System.out.println(base64str);
        // 參數封裝
        NutMap map = new NutMap();
        map.addv("key", "84f7e1be67db18c721fcfb0685720a11");
        map.addv("image", base64str);
        map.addv("side", "front");
        // 請求聚合接口
        String str = Http.post("http://apis.juhe.cn/idimage/verify", map, 20 * 1000);
        System.out.println(str);
    }

我用的框架是Nutz,這個框架都封裝了一些Http請求的方法,我就直接拿來用了

看控制台打印,以下結果我都換了多張圖片去測試,准確率滿分,

注:昨晚就開始搞這個了,然后遇到了個異常,那時候沒想出來是什么原因,就放了一下,回去之后,我在想,是不是轉了base64之后就變成了200多萬個字節的問題,是不是聚合那邊不接受那么長的參數,如果不接收,那為什么需要轉base64?后面仔細想了一下代碼,猛地發現,是不是鏈接超時了?因為我的超時時間是 1000 毫秒,也就是 1 秒,那我想了一下,從我這里請求聚合 --》 聚合去識別這張圖片並返回數據給我,這個過程需要多久?早上回來第一時間把連接時間改成20秒,然后整個世界都安靜了,媽的,我就是個智障

還有一個點就是 轉 base64 需要 sun.misc.base64decoder.jar 這個jar我找了一下,找不到maven的我就沒照了,各位有人找到的話,給我留個言,哈哈哈哈

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM