Tess-two - Tess-two 文字識別(Tess-two 概述、Tess-two 文字識別、補充情況)

一、Tess-two 概述

  1. Tess-two 是 Tesseract OCR 引擎在 Android 平臺上的一個封裝庫,用于實現離線文字識別

  2. Tess-two 的 GitHub 官網:https://github.com/rmtheis/tess-two


二、Tess-two 文字識別

1、演示
(1)Dependencies
  • 模塊級 build.gradle
implementation 'com.rmtheis:tess-two:9.1.0'
(2)Tessdata
  1. 從 Tessdata 倉庫 https://github.com/tesseract-ocr/tessdata 下載所需語言包

  2. 例如,eng.traineddata 用于英文、chi_sim.traineddata 用于簡體中文

  3. 將下載的 .traineddata 文件放在項目的 src/main/assets 目錄下

(3)Manifest
  • AndroidManifest.xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
(4)Test
  • MainActivity.java
public class MainActivity extends AppCompatActivity {public static final String TAG = MainActivity.class.getSimpleName();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED|| checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(),o -> {for (Map.Entry<String, Boolean> entry : o.entrySet()) {Log.i(TAG, entry.getKey() + " : " + entry.getValue());}boolean allGranted = true;for (Map.Entry<String, Boolean> entry : o.entrySet()) {if (!entry.getValue()) {allGranted = false;break;}}if (allGranted) {test();} else {Log.i(TAG, "權限未全部授予");}}).launch(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE});} else {test();}}private void test() {copyTessDataToStorage("chi_sim.traineddata", "eng.traineddata");TessBaseAPI tessBaseAPI = new TessBaseAPI();String tesseractDirPath = getExternalFilesDir(null) + "/tesseract/";boolean initResult = tessBaseAPI.init(tesseractDirPath, "chi_sim+eng");if (!initResult) {Log.i(TAG, "初始化 Tesseract 失敗");return;}Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test_img);tessBaseAPI.setImage(bitmap);String result = tessBaseAPI.getUTF8Text();Log.i(TAG, "result: " + result);}public void copyTessDataToStorage(String... tessDataFiles) {String tessDataDirPath = getExternalFilesDir(null) + "/tesseract/tessdata/";File tessDataDir = new File(tessDataDirPath);if (!tessDataDir.exists()) {tessDataDir.mkdirs();}AssetManager assetManager = getAssets();for (String fileName : tessDataFiles) {File outFile = new File(tessDataDirPath + fileName);if (outFile.exists()) continue;try (InputStream in = assetManager.open(fileName);OutputStream out = new FileOutputStream(outFile)) {byte[] buffer = new byte[1024];int read;while ((read = in.read(buffer)) != -1) {out.write(buffer, 0, read);}} catch (IOException e) {e.printStackTrace();}}}
}
# 輸出結果result: 張 三
2、解讀
(1)請求權限
  1. 通過 checkSelfPermission 方法檢查是否已有權限,如果已有權限,執行測試代碼

  2. 如果沒有權限,則使用 Activity Result API 請求權限

  3. 請求完成后,檢查所有權限是否都被授予,如果都被授予,執行測試代碼

// 檢查是否已有權限
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED|| checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {// 如果沒有權限,請求權限registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(),o -> {for (Map.Entry<String, Boolean> entry : o.entrySet()) {Log.i(TAG, entry.getKey() + " : " + entry.getValue());}boolean allGranted = true;for (Map.Entry<String, Boolean> entry : o.entrySet()) {if (!entry.getValue()) {allGranted = false;break;}}// 檢查所有權限是否都被授予if (allGranted) {// 如果都被授予,執行測試代碼test();} else {Log.i(TAG, "權限未全部授予");}}).launch(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE});
} else {// 如果已有權限,執行測試代碼test();
}
(2)復制 Tessdata
  • src/main/assets 目錄復制 .traineddata 文件到應用私有存儲外部目錄的 files/tesseract/tessdata/ 目錄
public void copyTessDataToStorage(String... tessDataFiles) {// 創建目標目錄String tessDataDirPath = getExternalFilesDir(null) + "/tesseract/tessdata/";File tessDataDir = new File(tessDataDirPath);if (!tessDataDir.exists()) {tessDataDir.mkdirs();}AssetManager assetManager = getAssets();for (String fileName : tessDataFiles) {File outFile = new File(tessDataDirPath + fileName);if (outFile.exists()) continue; // 如果文件已存在則跳過try (InputStream in = assetManager.open(fileName);OutputStream out = new FileOutputStream(outFile)) {byte[] buffer = new byte[1024];int read;while ((read = in.read(buffer)) != -1) {out.write(buffer, 0, read);}} catch (IOException e) {e.printStackTrace();}}
}
(3)初始化與識別
  • 調用 init 方法初始化 Tesseract
  1. 第一個參數是包含 Tessdata 目錄的父目錄,Tessdata 在 files/tesseract/tessdata/ 目錄,那么這里就是 files/tesseract/

  2. 第二個參數是語言代碼,多個可以用加號 + 連接,chi_sim+eng 表示識別中文和英文

TessBaseAPI tessBaseAPI = new TessBaseAPI();String tesseractDirPath = getExternalFilesDir(null) + "/tesseract/";boolean initResult = tessBaseAPI.init(tesseractDirPath, "chi_sim+eng");
if (!initResult) {Log.i(TAG, "初始化 Tesseract 失敗");return;
}
  • 調用 setImage 方法識別,調用 getUTF8Text 獲取識別結果
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test_img);tessBaseAPI.setImage(bitmap);String result = tessBaseAPI.getUTF8Text();Log.i(TAG, "result: " + result);

三、補充情況

1、Bitmap 獲取失敗的情況
  • 這里從一個不存在的資源文件獲取 Bitmap
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), 1001);Log.i(TAG, "bitmap: " + bitmap);tessBaseAPI.setImage(bitmap);String result = tessBaseAPI.getUTF8Text();Log.i(TAG, "result: " + result);
# 輸出結果bitmap: null
...
FATAL EXCEPTION: main
Process: com.my.ocr_tesseract, PID: 25149
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.ocr_tesseract/com.my.ocr_tesseract.MainActivity}: java.lang.RuntimeException: Failed to read bitmap
2、識別連筆字
  • Tess-two 文字識別,識別連筆字的能力有限,推薦使用 ML Kit 數字墨水識別
# 輸出結果result: 
# 輸出結果result: 鋤
3、使用應用私有存儲內部目錄
  • 也可以使用應用私有存儲內部目錄,這樣也不需要請求權限
private void test() {copyTessDataToStorage("chi_sim.traineddata", "eng.traineddata");TessBaseAPI tessBaseAPI = new TessBaseAPI();String tesseractDirPath = getFilesDir() + "/tesseract/";boolean initResult = tessBaseAPI.init(tesseractDirPath, "chi_sim+eng");if (!initResult) {Log.i(TAG, "初始化 Tesseract 失敗");return;}Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test_img);Log.i(TAG, "bitmap: " + bitmap);tessBaseAPI.setImage(bitmap);String result = tessBaseAPI.getUTF8Text();Log.i(TAG, "result: " + result);
}public void copyTessDataToStorage(String... tessDataFiles) {String tessDataDirPath = getFilesDir() + "/tesseract/tessdata/";File tessDataDir = new File(tessDataDirPath);if (!tessDataDir.exists()) {tessDataDir.mkdirs();}AssetManager assetManager = getAssets();for (String fileName : tessDataFiles) {File outFile = new File(tessDataDirPath + fileName);if (outFile.exists()) continue;try (InputStream in = assetManager.open(fileName);OutputStream out = new FileOutputStream(outFile)) {byte[] buffer = new byte[1024];int read;while ((read = in.read(buffer)) != -1) {out.write(buffer, 0, read);}} catch (IOException e) {e.printStackTrace();}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96346.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96346.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96346.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

八、Win/Linux/macOS全平臺徹底卸載Docker的操作指南

八、Win/Linux/macOS全平臺徹底卸載Docker的操作指南 系列文章目錄 1. 卸載前準備工作(可忽略) 1.1 數據備份 1.2 停止Docker服務 2. 不同操作系統卸載步驟 2.1 Linux系統 2.2 macOS系統 2.3 Windows系統 3. 殘留文件深度清理 3.1 Linux系統 3.2 macOS系統 3.3 Windows系統 4…

強化學習-CH9 策略梯度方法

強化學習-CH9 策略梯度方法 當策略被表示為函數時&#xff0c;通過優化目標函數可以得到最優策略。 這種方法稱為策略梯度。策略梯度方法是基于策略的&#xff0c;而之前介紹的方法都是基于值的。其本質區別在于基于策略的方法是直接優化關于策略參數的目標函數。 9.1 策略表示…

[玩轉GoLang] 5分鐘整合Gin / Gorm框架入門

方法 / 步驟 一: Gin框架 1.1 : 環境 & 項目配置 1, GoLand創建項目 創建main.go package mainimport ("github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/", func(c *gin.Context) {c.JSON(200, gin.H{"message": "…

【項目復現】MOOSE-Chem 用于重新發現未見化學科學假說的大型語言模型

項目地址 ZonglinY/MOOSE-Chem: [ICLR 2025] --- ZonglinY/MOOSE-Chem: [ICLR 2025] https://github.com/ZonglinY/MOOSE-Chem git代碼同步&#xff1a; 同步地址如下&#xff1a;QianPengfei1/MOOSE-Chem: [ICLR 2025] <MOOSE-Chem: Large Language Models for Rediscove…

深入解析TCP核心機制:連接管理、流量與擁塞控制

目錄 一、三次握手與四次揮手&#xff1a;可靠連接的建立與終止 1. 三次握手 - 建立連接 為什么是三次&#xff1f; 2. 四次揮手 - 終止連接 為什么需要TIME_WAIT狀態&#xff1f; 二、流量控制與滑動窗口&#xff1a;解決收發速度不匹配 核心機制&#xff1a;滑動窗口協…

如何在 DevOps 管道中實現 AI?

對于許多尋求提升效率、優化性能并縮短上市時間的組織而言,將人工智能 (AI) 集成到 DevOps 流水線中已成為一項戰略舉措。AI 與 DevOps 的結合,有時被稱為 AIOps(面向 IT 運營的人工智能),正在重塑開發和運營團隊構建、測試、發布和維護軟件應用程序的方式。本文將引導您了…

【Agent】DeerFlow Planner:執行流程與架構設計(基于真實 Trace 深度解析)

本文檔系統闡述 DeerFlow 中 Planner 的職責邊界、端到端執行流程、關鍵節點設計、數據結構、容錯與人審機制&#xff0c;以及與研究/編碼子代理的協同方式。面向開發與運維讀者&#xff0c;幫助快速理解與調優 Planner 相關鏈路。 時序圖&#xff08;Sequence Diagram&#xf…

后端接口防止XSS漏洞攻擊

有這樣一個場景&#xff0c;首先構建一個docx文件并插入超鏈接&#xff08;惡意的鏈接&#xff09;&#xff0c;上傳到文件服務器后獲取對應的文件filekey。現在我們提供一個預覽接口&#xff0c;通過filekey便可以預覽&#xff0c;在根據filekey轉html文檔返回給頁面的時候由于…

4.1Vue基本使用

1.使用Vue-引入 Vue 的本質,就是一個 JavaScript 的庫: 剛開始我們不需要把它想象的非常復雜; 我們就把它理解成一個已經幫我們封裝好的庫; 在項目中可以引入并且使用它即可。 那么安裝和使用 Vue 這個 JavaScript 庫有哪些方式呢? 方式一:在頁面中通過 CDN 的方式來引…

CAD繪圖:雜項

一、樣式標注管理器 新建CAD圖紙的樣式標注是定死的,需要手動去改變合適的大小 1)命令行中直接輸入“D”,打開樣式標注管理器 2)點擊“修改”,可以改變其顏色,線條樣式以及文字大小、顏色、字體等 3)若想添加字體: a)在網上下載需要的字體 b)右鍵Auto CAD圖標(…

Git上有更新而本地無更新時的解決方案

問題分析 分支名稱不匹配&#xff1a;你嘗試推送到 main 分支&#xff0c;但你當前在 master 分支上遠程倉庫有新內容&#xff1a;遠程倉庫包含你本地沒有的提交&#xff0c;需要先拉取 解決方案 方法1&#xff1a;繼續使用 master 分支 # 1. 先拉取遠程更改 git pull origin m…

用于骨盆骨折復位與固定自動術前手術規劃的基于幾何的端到端流水線|文獻速遞-最新醫學人工智能文獻

Title題目An End-to-End Geometry-Based Pipeline forAutomatic Preoperative Surgical Planning ofPelvic Fracture Reduction and Fixation用于骨盆骨折復位與固定自動術前手術規劃的基于幾何的端到端流水線01文獻速遞介紹骨盆骨折及其術前規劃相關研究背景與本文方法 骨盆骨…

【導航】OS復習

【OS】操作系統概述-CSDN博客 【OS】PV-CSDN博客 【OS】進程與線程-CSDN博客 【OS】文件管理-CSDN博客 【OS】IO_檢查用戶io請求的合法性-CSDN博客

Google Nano-banana AI模型圖像生成能力實證分析:基于47個案例的系統化技術驗證

Google Nano-banana AI模型官方示例庫&#xff08;Awesome-Nano-Banana&#x1f34c;-images&#xff09;&#xff0c;通過系統化分析47個技術案例&#xff0c;實證驗證其在圖像生成、編輯與轉換任務中的核心能力。所有測試基于Apache 2.0開源許可的公開案例數據集&#xff0c;…

MySQL 多表操作與復雜查詢:深入理解多表關系和高級查詢

大家好&#xff01;今天我們要深入探討 MySQL 中兩個非常重要的主題——多表操作 和 復雜查詢。一. 多表操作什么是多表操作&#xff1f;在實際應用中&#xff0c;數據通常分布在多個表中&#xff0c;需要通過多表操作來獲取完整信息。比如&#xff0c;一個學生表和一個課程表之…

Java入門級教程7——eclipse新建Maven項目,創建和連接數據庫,創建數據庫表

目錄 1.若沒有Maven項目&#xff0c;可以選擇新建 2.添加Maven依賴 3.數據庫的創建 3.1 新建連接 --> 創建數據庫 3.2 創建數據庫表 4.連接數據庫 1.若沒有Maven項目&#xff0c;可以選擇新建 步驟一&#xff1a;點擊 File --> New --> Project 步驟二&#xf…

請求庫-axios

Axios 是一個基于 Promise 的 HTTP 客戶端庫&#xff0c;用于瀏覽器和 Node.js 環境。它支持發送異步 HTTP 請求&#xff0c;并提供了簡潔的 API 來處理請求和響應。1、安裝axios因為axios是一個第三方庫&#xff0c;所以在使用之前我們需要先安裝第三方模塊。安裝 Axios 需通過…

電子煙的4種屏幕驅動集成語音方案介紹

目前電子煙在全球市場的表現非常不錯&#xff0c;很多國產電子煙廠家都有非常不錯的產品&#xff0c;而屏幕驅動方案是電子煙智能化的重要組成部分&#xff0c;今天就給大家帶來電子煙的4種主流屏幕驅動方案(含2025年最新版方案)。?  方案一、LED顯示方案語音播報集成方案 W…

無法加載 DLL“xxxxxxx.dll”: 找不到指定的模塊。 (異常來自 HRESULT:0x8007007E)。

(無法加載 DLL“xxxxxxx.dll”: 找不到指定的模塊。 (異常來自 HRESULT:0x8007007E)。) 這個錯誤&#xff1a; 無法加載 DLL“ZH_P2P_Libx64.dll”: 找不到指定的模塊。 (異常來自 HRESULT:0x8007007E) 意味著你的程序在運行時試圖加載一個名為 xxxxxxx.dll 的動態鏈接庫&#…

Flask/Django 生產部署:Gunicorn vs Nginx,Windows 與 Linux 實戰指引

Flask/Django 生產部署&#xff1a;Gunicorn vs Nginx&#xff0c;Windows 與 Linux 實戰指引 TL;DR Gunicorn&#xff1a;Python WSGI 應用服務器&#xff0c;運行 Flask/Django&#xff08;Linux 用&#xff09;。Nginx&#xff1a;反向代理/網關&#xff08;TLS、靜態、限流…