什么是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的我就沒照了,各位有人找到的話,給我留個言,哈哈哈哈