一、引言
你是否曾遇到過這樣的情況:看到一段有用的文字,想要快速複製下來,卻只能眼巴巴地盯著螢幕,手動輸入?其實,Java 也可以輕鬆實現 OCR(光學字符識別)功能,讓你輕鬆識別並提取圖片中的文字資訊。不需要龐大的外部工具,也不必擔心複雜的配置,只需幾行程式碼,Java 就能幫你搞定 OCR!接下來,我們將帶你一步步揭開這項技術的神秘面紗,讓你的 Java 專案更加智慧、便捷。
二、功能演示
先讓我們看看最終效果,再進行實現
三、功能實現
1. 描述
在這部分,我們將使用 SpringBoot 和 Tess4j 來實現 OCR 功能。Tess4j 是一個基於 Tesseract 的 Java 封裝庫,它讓我們能夠輕鬆地在 Java 應用中使用 OCR 技術。無論你是在處理掃描的文件、識別圖片中的文字,還是自動化讀取截圖內容,Tess4j 都能派上用場。透過與 SpringBoot 結合,我們可以快速搭建一個輕量級的 RESTful 服務,輕鬆應對各種 OCR 需求。
2. 編碼實現
2.1 引入依賴
<dependency> <groupId>net.sourceforge.tess4j</groupId> <artifactId>tess4j</artifactId> </dependency>
2.2 初始化Tesseract引擎
注意事項 :
專案部署:
使用
new ClassPathResource("tess_data").getFile().getAbsolutePath()
可能在專案打成 Jar 包後無法正常訪問。爲了解決這個問題,可以參考一些開源專案中的TensorflowUtil
工具類,將resource
檔案進行轉存後再載入。在 Linux 環境中,還需要解決
無法初始化 net.sourceforge.tess4j.TessAPI
的問題,確保所有必要的依賴庫和系統配置正確。訓練資料:
tessdata_best: 主要針對高精度要求的應用場景,雖然識別速度較慢,但結果更準確。
tessdata: 是標準的訓練資料集,平衡了識別速度和精度,適合一般的 OCR 應用。
tessdata_fast: 適用於需要快速識別的場景,雖然精度略低,但可以顯著提升識別速度。
不同的訓練資料和配置會影響識別結果的精度和速度
。可以根據實際需求自行訓練適合的資料集。免費的訓練資料包括:
/** * TesseractOcr 模型載入 * * @author : YiFei */ @Slf4j @Getter @Component public class TesseractOcrModelService { private final Tesseract tesseract = new Tesseract(); public TesseractOcrModelService() { try { // 獲取訓練模型資料夾 (該方法在打包為jar後會有問題,建議使用專案中TensorflowUtil工具類) String folderPath = new ClassPathResource("tess_data").getFile().getAbsolutePath(); /* * OEM_TESSERACT_ONLY = 0:表示僅執行Tesseract OCR引擎,不使用LSTM(Long Short-Term Memory)線識別器。Tesseract是一種傳統的OCR引擎,適用於一般的文字識別任務。 * OEM_LSTM_ONLY = 1:表示僅執行LSTM線識別器,不使用Tesseract。LSTM是一種深度學習模型,通常在處理複雜文字或手寫文字識別等任務時表現較好。 * OEM_TESSERACT_LSTM_COMBINED = 2:表示同時執行Tesseract和LSTM識別器,並在遇到困難情況時允許回退到Tesseract。這種組合模式可以在不同情況下靈活地選擇最適合的識別引擎。 * OEM_DEFAULT = 3:當呼叫 init_*() 方法時指定此模式,表示可以根據語言特定配置、命令列配置等自動推斷使用哪種模式。如果沒有明確指定,則預設使用 OEM_TESSERACT_ONLY 模式。 */ tesseract.setPageSegMode(OEM_TESSERACT_LSTM_COMBINED); // 設定Tesseract OCR引擎的訓練資料資料夾路徑 /* * chi_sim.traineddata: Chinese Simplified(中文簡體) * chi_sim_vert.traineddata: Chinese Simplified Vertical(中文簡體豎排) * chi_tra.traineddata: Chinese Traditional(中文繁體) * chi_tra_vert.traineddata: Chinese Traditional Vertical(中文繁體豎排) */ tesseract.setDatapath(folderPath); tesseract.setPageSegMode(6); // 設定為中文簡體 tesseract.setLanguage("chi_sim"); } catch (Exception e) { throw new RuntimeException(e); } } }
2.3 編寫 RESTful 介面
/** * Ocr-控制器 * * @author : YiFei */ @RestController @RequestMapping("ocr") @RequiredArgsConstructor public class OcrController { private final TesseractOcrModelService tesseractOcrModelService; @PostMapping("/detection") public Result<String> ocrDetection(MultipartFile file) { try { /* 圖片調整推薦 : 二值化:將影象轉換為黑白,有助於提高對比度。 去噪:去除影象中的噪聲。 旋轉矯正:確保影象中的文字是水平的。 */ Tesseract tesseract = tesseractOcrModelService.getTesseract(); return Result.success(tesseract.doOCR(ImageIO.read(file.getInputStream()))); } catch (Exception e) { throw new RuntimeException("ImageIO.read(file.getInputStream())) 解析錯誤"); } } }