切換語言為:簡體
基於 Java 輕鬆實現OCR功能

基於 Java 輕鬆實現OCR功能

  • 爱糖宝
  • 2024-08-30
  • 2057
  • 0
  • 0

一、引言

你是否曾遇到過這樣的情況:看到一段有用的文字,想要快速複製下來,卻只能眼巴巴地盯著螢幕,手動輸入?其實,Java 也可以輕鬆實現 OCR(光學字符識別)功能,讓你輕鬆識別並提取圖片中的文字資訊。不需要龐大的外部工具,也不必擔心複雜的配置,只需幾行程式碼,Java 就能幫你搞定 OCR!接下來,我們將帶你一步步揭開這項技術的神秘面紗,讓你的 Java 專案更加智慧、便捷。

二、功能演示

先讓我們看看最終效果,再進行實現

基於 Java 輕鬆實現OCR功能

三、功能實現

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())) 解析錯誤");
        }
    }
}

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.