Java使用Tesseract-OCR實(shí)戰(zhàn)教程
Java使用Tesseract-OCR
光學(xué)字符識(shí)別(OCR, Optical Character Recognition)技術(shù)可以將圖像中的文本轉(zhuǎn)換為可編輯的文本。
Tesseract是目前最為流行的開源OCR引擎之一,支持多種語(yǔ)言和高效的文本識(shí)別。
本文將詳細(xì)介紹如何在Java中使用Tesseract-OCR進(jìn)行文本提取,包括Tesseract-OCR的安裝、中文訓(xùn)練庫(kù)的配置、依賴庫(kù)的引入以及具體的代碼實(shí)現(xiàn)。通過(guò)這個(gè)過(guò)程,我們將演示如何從視頻幀中提取文本。
Tesseract-OCR安裝
首先,我們需要在系統(tǒng)上安裝Tesseract-OCR??梢酝ㄟ^(guò)以下鏈接下載適用于Windows的安裝包:
下載完成后,運(yùn)行安裝程序并選擇安裝目錄,默認(rèn)下一步安裝即可。
配置中文訓(xùn)練庫(kù)
為了使Tesseract能夠識(shí)別中文,我們需要下載中文簡(jiǎn)體的訓(xùn)練庫(kù)文件chi_sim.traineddata
,并將其放置在Tesseract的tessdata
目錄下。
例如:
makefile D:\Program Files\Tesseract-OCR\tessdata
可以從以下鏈接下載中文訓(xùn)練庫(kù):
更多訓(xùn)練庫(kù)可以在Tesseract官方GitHub倉(cāng)庫(kù)找到。
引入依賴
為了在Java中使用Tesseract,我們需要引入tess4j
庫(kù)。tess4j
是一個(gè)Java的Tesseract API封裝,可以方便地在Java項(xiàng)目中使用Tesseract。此外,為了處理視頻幀,我們還需要javacv
庫(kù)。
以下是需要在Maven項(xiàng)目中引入的依賴:
```xml <dependency> <groupId>net.sourceforge.tess4j</groupId> <artifactId>tess4j</artifactId> <version>5.3.0</version> </dependency> <!-- JavaCV: Java interface to OpenCV, FFmpeg, and more --> <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platform</artifactId> <version>1.5.7</version> </dependency>
代碼實(shí)現(xiàn)
接下來(lái),我們將實(shí)現(xiàn)一個(gè)Java類VideoTextExtractor
,該類用于從視頻中提取文本。
完整代碼如下:
```java import net.sourceforge.tess4j.TesseractException; import org.bytedeco.javacv.FFmpegFrameGrabber; import org.bytedeco.javacv.Frame; import org.bytedeco.javacv.Java2DFrameUtils; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.Set; public class VideoTextExtractor { // Tesseract-OCR安裝路徑 public static final String pathToTessdataFolder = "D:\\Program Files\\Tesseract-OCR\\tessdata\\"; // 加載視頻 public static final String pathToVideoFile = "C:\\Users\\lixiewen\\Documents\\oCam\\錄制_2023_05_31_09_39_51_172.mp4"; // 解析結(jié)果 public static final String resultFile = "E:\\tmp\\tmp.txt"; public static void main(String[] args) throws TesseractException { extracted(); } private static void extracted() { // 設(shè)置Tesseract OCR庫(kù)的路徑 File tessDataFolder = new File(pathToTessdataFolder); System.setProperty("TESSDATA_PREFIX", tessDataFolder.getAbsolutePath()); FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(pathToVideoFile); try { grabber.start(); Set<String> set = new LinkedHashSet<>(); // 遍歷視頻幀 int lengthInFrames = grabber.getLengthInFrames(); for (int i = 0; i < lengthInFrames; i++) { System.out.println("進(jìn)度 " + i + " / " + lengthInFrames); try { Frame frame = grabber.grabImage(); if (frame == null) continue; BufferedImage bufferedImage = Java2DFrameUtils.toBufferedImage(frame); // 將幀轉(zhuǎn)換為灰度圖像 BufferedImage grayImage = new BufferedImage(bufferedImage.getWidth(), bufferedImage.getHeight(), BufferedImage.TYPE_BYTE_GRAY); Graphics2D graphics = grayImage.createGraphics(); graphics.drawImage(bufferedImage, 0, 0, null); graphics.dispose(); // 創(chuàng)建臨時(shí)文件保存圖像 File tempImageFile = File.createTempFile("frame", ".png"); ImageIO.write(grayImage, "png", tempImageFile); Tesseract tesseract = getTesseract(tessDataFolder); String result = tesseract.doOCR(tempImageFile); set.add(result); // 刪除臨時(shí)文件 tempImageFile.delete(); } catch (Exception e) { e.printStackTrace(); } } File file = new File(resultFile); FileUtils.write2File(file, new ArrayList<>(set)); grabber.stop(); } catch (Exception e) { e.printStackTrace(); } } private static Tesseract getTesseract(File tessDataFolder) { // 使用Tesseract OCR進(jìn)行文字識(shí)別 Tesseract tesseract = new Tesseract(); // 設(shè)置中文訓(xùn)練庫(kù) tesseract.setLanguage("chi_sim"); tesseract.setDatapath(tessDataFolder.getAbsolutePath()); return tesseract; } }
免安裝方式
如果不希望安裝Tesseract-OCR,可以直接在項(xiàng)目中引入訓(xùn)練庫(kù)。這種方式適合希望更方便地管理依賴的開發(fā)者。
- 引入Maven依賴
- 在代碼中引入訓(xùn)練庫(kù)
```java import net.sourceforge.tess4j.Tesseract; public class OCRUtil { public static ITesseract getTesseract() throws Exception { // 使用 Tesseract 識(shí)別文本 ITesseract tesseract = new Tesseract(); // 設(shè)置訓(xùn)練數(shù)據(jù)文件夾路徑 tesseract.setDatapath("src/main/resources/traineddata"); // 設(shè)置為中文簡(jiǎn)體 tesseract.setLanguage("chi_sim"); return tesseract; } }
優(yōu)化與提升
在實(shí)際應(yīng)用中,我們可以對(duì)視頻幀的處理和OCR識(shí)別進(jìn)行優(yōu)化,以提高識(shí)別效率和準(zhǔn)確性。以下是一些建議:
- 圖像預(yù)處理:在進(jìn)行OCR識(shí)別之前,可以對(duì)圖像進(jìn)行去噪、二值化、旋轉(zhuǎn)校正等預(yù)處理,以提高識(shí)別率。
- 多線程處理:對(duì)于長(zhǎng)時(shí)間的視頻處理,可以使用多線程來(lái)提高幀處理速度。
- 自定義訓(xùn)練數(shù)據(jù):如果默認(rèn)的訓(xùn)練數(shù)據(jù)效果不理想,可以通過(guò)Tesseract的訓(xùn)練工具自定義訓(xùn)練數(shù)據(jù),以提高特定場(chǎng)景下的識(shí)別準(zhǔn)確率。
- 結(jié)果后處理:OCR識(shí)別的文本可能包含一些噪聲字符,可以通過(guò)正則表達(dá)式等方法對(duì)結(jié)果進(jìn)行清洗和校正。
以下是一個(gè)優(yōu)化后的圖像預(yù)處理示例:
```java // 轉(zhuǎn)換為灰度圖像 BufferedImage grayImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY); Graphics2D graphics = grayImage.createGraphics(); graphics.drawImage(image, 0, 0, null); graphics.dispose(); // 二值化處理 for (int y = 0; y < grayImage.getHeight(); y++) { for (int x = 0; x < grayImage.getWidth(); x++) { int rgb = grayImage.getRGB(x, y); int gray = (rgb & 0xff); gray = gray > 128 ? 255 : 0; grayImage.setRGB(x, y, (gray << 16) | (gray << 8) | gray); } } return grayImage; }
總結(jié)
通過(guò)本文的介紹,我們?cè)敿?xì)講解了如何在Java中使用Tesseract-OCR進(jìn)行文本提取的全過(guò)程。包括Tesseract-OCR的安裝、中文訓(xùn)練庫(kù)的配置、依賴庫(kù)的引入以及具體的代碼實(shí)現(xiàn),并提供了一些優(yōu)化建議。
這些內(nèi)容能幫助您在實(shí)際項(xiàng)目中更好地應(yīng)用Tesseract-OCR進(jìn)行文本識(shí)別。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Kotlin:forEach也能break和continue
這篇文章主要介紹了詳解Kotlin:forEach也能break和continue的相關(guān)資料,需要的朋友可以參考下2017-06-06SpringBoot字段注入和構(gòu)造函數(shù)注入的區(qū)別及說(shuō)明
這篇文章主要介紹了SpringBoot字段注入和構(gòu)造函數(shù)注入的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04Mybatis的特點(diǎn)及優(yōu)點(diǎn)
Mybatis 本是apache的一個(gè)開源項(xiàng)目iBatis, 2010年這個(gè)項(xiàng)目由apache software foundation 遷移到了google code,并且改名為MyBatis。mybatis有哪些特點(diǎn)和優(yōu)點(diǎn)呢?通過(guò)本文一起學(xué)習(xí)吧2016-12-12springboot druid數(shù)據(jù)庫(kù)配置密碼加密的實(shí)現(xiàn)
Druid是阿里開發(fā)的數(shù)據(jù)庫(kù)連接池,本文主要介紹了springboot druid數(shù)據(jù)庫(kù)配置密碼加密的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06Spring實(shí)戰(zhàn)之XML與JavaConfig的混合配置詳解
大家都知道Spring的顯示配置方式有兩種,一種是基于XML配置,一種是基于JavaConfig的方式配置。那么下這篇文章主要給大家分別介紹如何在JavaConfig中引用XML配置的bean以及如何在XML配置中引用JavaConfig,需要的朋友可以參考下。2017-07-07Spring注解@RestControllerAdvice原理解析
這篇文章主要介紹了Spring注解@RestControllerAdvice原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11淺談java socket的正確關(guān)閉姿勢(shì)
這篇文章主要介紹了java socket的正確關(guān)閉姿勢(shì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06JavaWeb ServletConfig作用及原理分析講解
ServletConfig對(duì)象,叫Servlet配置對(duì)象。主要用于加載配置文件的初始化參數(shù)。我們知道一個(gè)Web應(yīng)用里面可以有多個(gè)servlet,如果現(xiàn)在有一份數(shù)據(jù)需要傳給所有的servlet使用,那么我們就可以使用ServletContext對(duì)象了2022-10-10