🚀功能特性
免費(fèi):本項(xiàng)目所有代碼開(kāi)源,完全免費(fèi)。
方便:解壓即用,離線運(yùn)行,無(wú)需網(wǎng)絡(luò)。
高效:自帶高效率的離線OCR引擎,內(nèi)置多種語(yǔ)言識(shí)別庫(kù)。
靈活:支持命令行、HTTP接口等外部調(diào)用方式。
功能:截圖OCR / 批量OCR / PDF識(shí)別 / 二維碼 / 公式識(shí)別
Umi-OCR提供了多種下載方式,可以安裝網(wǎng)絡(luò)環(huán)境自行選擇。下載后,直接解壓使用即可:
# 藍(lán)奏云 (國(guó)內(nèi)推薦,免注冊(cè)/無(wú)限速)
https://hiroi-sora.lanzoul.com/s/umi-ocr
# Github release
https://github.com/hiroi-sora/Umi-OCR/releases/latest
# Source Forge
https://sourceforge.net/projects/umi-ocr
支持屏幕截圖,粘貼圖片,快捷轉(zhuǎn)文字,支持識(shí)別欄編輯文字,允許劃選多個(gè)記錄復(fù)制。
支持設(shè)別后文本后處理,整理OCR結(jié)果的排版和順序,使文本更適合閱讀和使用。
對(duì)批量導(dǎo)入本地圖片進(jìn)行識(shí)別,支持與截圖OCR一樣的文本后處理功能,可一次性導(dǎo)入幾百?gòu)垐D片進(jìn)行任務(wù)。
OCR文本后處理支持忽略區(qū)域,適用于排除圖片中的不想要的文字。
支持pdf, xps, epub, mobi, fb2, cbz 等格式文檔批量識(shí)別,支持設(shè)定忽略區(qū)域,可用于排除頁(yè)眉頁(yè)腳的文字。
截圖/粘貼/拖入本地圖片,讀取其中的二維碼、條形碼,支持19種協(xié)議。
Umi-OCR同時(shí)提供了本地命令行和HTTP接口。本次我們主要基于的Umi-OCR接口,將其封裝為一個(gè)簡(jiǎn)單的B/S架構(gòu)WEB應(yīng)用。
# Umi-OCR http接口說(shuō)明文檔
https://github.com/hiroi-sora/Umi-OCR/blob/main/docs/http/README.md
一、開(kāi)放HTTP接口地址
在全局設(shè)置頁(yè)中勾選高級(jí)設(shè)置,允許HTTP服務(wù)才能使用HTTP接口,將主機(jī)切換到任何可用地址。
二、WEB封裝設(shè)計(jì)說(shuō)明
三、具體代碼實(shí)現(xiàn)
from flask import Flask, request, render_template, jsonify
import requests
import base64
import os
from werkzeug.utils import secure_filename
import json
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads/' # 確保這個(gè)文件夾存在
def format_result(data):
formatted_results = []
for item in data:
result = {
'text': item.get('text', ''),
'score': item.get('score', 0),
'bounding_box': item.get('box', [])
}
formatted_results.append(result)
return formatted_results
@app.route('/', methods=['GET'])
def index():
return render_template('index.html')
@app.route('/upload', methods=['POST'])
def upload_file():
if request.method == 'POST':
# 獲取上傳的圖片
image_file = request.files['image']
if image_file:
filename = secure_filename(image_file.filename)
image_file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
# 讀取圖片內(nèi)容并轉(zhuǎn)換為base64編碼
with open(os.path.join(app.config['UPLOAD_FOLDER'], filename), "rb") as image_file:
encoded_image = base64.b64encode(image_file.read()).decode('utf-8')
# 調(diào)用OCR接口
response = requests.post('http://xxx.xxx.xxx.xxx:1224/api/ocr', json={'base64': encoded_image})
# URL換成運(yùn)行umi-ocr的服務(wù)器地址,解析響應(yīng)
if response.status_code == 200:
result = response.json()
result['data'] = format_result(result['data']) # 格式化數(shù)據(jù)
return jsonify(result)
else:
return jsonify({'error': 'Failed to connect to OCR service'})
return jsonify({'error': 'No image provided'})
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>OCR識(shí)別結(jié)果展示</title>
<!-- 引入Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<style>
#results {
margin-top: 20px;
}
.result-text {
font-size: 16px;
color: #333;
}
</style>
</head>
<body>
<div class="container mt-4">
<h2>OCR識(shí)別結(jié)果</h2>
<form id="uploadForm" method="post" enctype="multipart/form-data">
<div class="form-group">
<input type="file" class="form-control" name="image" required>
</div>
<button type="submit" class="btn btn-primary">上傳圖片</button>
</form>
<div id="results" class="result-text"></div>
</div>
<!-- 引入jQuery和Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
<script>
$(document).ready(function() {
$('#uploadForm').submit(function(e) {
e.preventDefault();
var formData = new FormData(this);
$.ajax({
url: '/upload',
type: 'post',
data: formData,
contentType: false,
processData: false,
success: function(data) {
if (data.error) {
$('#results').text(data.error);
} else if (data.code === 100) {
// 將所有文本結(jié)果拼接并顯示
var allText = data.data.map(function(item) {
return item.text;
}).join('\n');
$('#results').text(allText);
} else {
$('#results').text('識(shí)別失敗或未檢測(cè)到文本。');
}
},
error: function(xhr, status, error) {
$('#results').text('請(qǐng)求出錯(cuò):' + error);
}
});
});
});
</script>
</body>
</html>
#需要python3環(huán)境,確保環(huán)境中安裝了Flask
pip install Flask easyocr -i https://mirrors.aliyun.com/pypi/simple/
# 創(chuàng)建運(yùn)行目錄
mkdir -p /opt/Umi-OCR/uploads
mkdir -p /opt/Umi-OCR/templates
# 將umi-ocr.py文件復(fù)制至 Umi-OCR目錄
mv umi-ocr.py /opt/Umi-OCR/
# 將index.html文件復(fù)制至Umi-OCR/templates目錄
mv index.html /opt/Umi-OCR/templates
# 運(yùn)行程序
python umi-ocr.py
* Running on http://xxx.xxx.xxx.xxx:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 379-609-535
四、使用測(cè)試
在頁(yè)面上傳圖片,查看識(shí)別效果
當(dāng)然,上述只是一個(gè)簡(jiǎn)單的教程,感興趣的同學(xué)可以在DEMO之上擴(kuò)展批量識(shí)別等功能。雖然Umi-OCR在使用上主要面向非專業(yè)用戶,但是在設(shè)計(jì)上提供了詳細(xì)的API接口和命令行。方便專業(yè)的開(kāi)發(fā)人員可以按照需要的場(chǎng)景和應(yīng)用自行擴(kuò)展和集成。