==========================================================================================================
寫在前面:
還是遇到了傳說中的登錄驗證識別碼數字圖片,從網上找了一些例子,然后覺得比較好的連接地址記錄下來,然后修改相關的內容成為能用的。
內容還是蠻實用的,方便以后查閱。
==========================================================================================================
參考鏈接:http://www.51testing.com/html/53/462853-3718359.html
遇到無法下載tesseract,然后網上查可以通過該目錄進行下載安裝。
https://blog.csdn.net/showgea/article/details/82656515
遇到的第三個問題是:對有噪點的圖片使用tesseract工具時,識別結果很差,但是對黑白照片視頻很好,所以想到了把圖片黑白化后再識別。
https://blog.csdn.net/zhulier1124/article/details/80606647
Tess4J識別OCR相關:
https://blog.csdn.net/zai_xia/article/details/80003778
https://sourceforge.net/p/tess4j/bugs/15/
識別驗證碼切割后的算法:https://www.cnblogs.com/zeze/p/5816742.html
https://www.cnblogs.com/nayitian/p/3282862.html
https://blog.csdn.net/qq_34351177/article/details/84992133
在識別的道路上總是遇到各種各樣的問題,現在可以裁剪圖片了,但是裁剪后的原圖是傾斜的,所以識別率也很低,於是找到旋轉圖片的方法。
https://blog.csdn.net/x541211190/article/details/80784713
package com.util; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; /*准備工具: * 1.下載安裝tesseract:http://sourceforge.net/projects/tesseract-ocr/ * 2.將tesseract.exe命令保存為bat文件,bat內容為 * @echo off tesseract.exe yzm.png 1 -l exit *獲取驗證碼步驟: *1、保存動態頁面中的圖片文件到本地; download(URL地址, "code.png"); 2、java運行tesseract批量處理bat文件,產生TXT文件保存到本地; String batPath = "cmd /c start G:\\uxin1\\selenium_xin\\code.bat"; runTesseractBat(String batPath) 3、讀取TXT文件; String filepath="G:/uxin1/selenium_xin/code.txt"; readTextFile(filePath) */ public class analysisIdentifyingCode { /* * 根據url下載驗證碼圖片並保存到指定的地址 * @strUrl 圖片下載地址 * @strPath 保存路徑 */ public void download(String strUrl,String strPath) { FileOutputStream utStream = null; try { //打開鏈接 URL url = new URL(strUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5 * 1000); //通過輸入流獲取圖片數據 InputStream inStream = conn.getInputStream(); //得到圖片的二進制數據,以二進制封裝得到數據,具有通用性 byte[] data =readInputStream(inStream); //new一個文件對象用來保存圖片,默認保存當前工程根目錄 File imageFile = new File(strPath); //創建輸出流 outStream = new FileOutputStream(imageFile); //寫入數據 outStream.write(data); //關閉輸出流 outStream.close(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (outStream != null) { outStream.close(); } } catch (IOException e) { e.printStackTrace(); } } } /* * java運行tesseract批量處理bat文件,產生TXT文件保存到本地 * @batPath batPath 存放的二進制圖片路徑 * */ public void runTesseractBat(String batPath) throws InterruptedException{ String cmd = batPath; Thread.sleep(2000); try { Runtime.getRuntime().exec(cmd); } catch (IOException e) { // TODO Auto-generated catch block Log.error("運行tesseract批量處理bat文件異常", e); } } /* * 讀取得到的txt文檔讀取獲取到的文本內容 * @batPath batPath 存放的二進制圖片路徑 * */ public static String readTextFile(String filePath) { String IdentificateTxt = null; String lineTxt = null; try { String encoding = "GBK"; File file = new File(filePath); if (file.isFile() && file.exists()) { // 判斷文件是否存在 InputStreamReader read = new InputStreamReader( new FileInputStream(file), encoding);// 考慮到編碼格式 BufferedReader bufferedReader = new BufferedReader(read); while ((lineTxt = bufferedReader.readLine()) != null) { Log.info(lineTxt); IdentificateTxt = lineTxt; } read.close(); } else { Log.error("----找不到指定的文件"); } } catch (Exception e) { Log.error("讀取文件內容出錯",e); } return IdentificateTxt; } /* * 讀取的文件流 * @batPath batPath 存放的二進制圖片路徑 * */ public static byte[] readInputStream(InputStream inStream) throws Exception{ ByteArrayOutputStream utStream = 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(); } }