给大家推荐一款实用的项目TrWebOCR,基于开源项目 Tr 构建的的中文离线OCR,识别率媲美大厂,并且提供了易用的web页面及web的接口,方便日常工作使用或者其他项目程序来调用API~
TrWebOCR 特点:
离线使用: 不用联网,数据更安全
识别准: 中文效果媲美大厂效果
简单调用: 自带网页界面,打开浏览器就能用,也支持API调用
一键部署: 用Docker三分钟就能跑起来
部署
飞牛 Compose方式部署代码
1️⃣我们需要先创建一个路径,这个路径储存我们的docker-Compose.yml的文件和配置文件
2️⃣打开Docker,Compose新增项目->输入项目名称->设置路径->上传或者创建docker-compose.yml把下面代码复制进去,点击完成直至构建完成
🐳Docker compose
version: '3' services: trwebocr: image: mmmz/trwebocr:latest container_name: trwebocr restart: unless-stopped ports: - "8089:8089" environment: -.UTF-8 volumes: - ./data:/app/tr_web/data # 持久化OCR数
使用
浏览器访问 http://ip:8089 访问web页面,就可以直接使用
识别演示
识别出来的原始数据结构
识别出的文字块,格式为:[[坐标信息], "识别文字", 置信度]
坐标信息 :文字在 图片中的位置(像素坐标)
识别文字 :OCR识别的具体内容
置信度 :识别准确率(0.99表示99%可信)
也有缺点,识别竖排文字的时候他还是横着识别,不过我试了微信截图识别文字、网上一些免费的OCR 也一样,都是不能竖排文字识别。
官方接口实例:
Python 使用File上传文件
import requests url = 'http://ip:8089/api/tr-run/' img1_file = { 'file': open('img1.png', 'rb') } res = requests.post(url=url, data={'compress': 0}, files=img1_file)
Python 使用Base64
import requests import base64 def img_to_base64(img_path): with open(img_path, 'rb')as read: b64 = base64.b64encode(read.read()) return b64 url = 'http://ip:8089/api/tr-run/' img_b64 = img_to_base64('./img1.png') res = requests.post(url=url, data={'img': img_b64})
使用Python和OpenCV实现的简易拍照OCR程序
添加GUI界面,在配合程序就能写一个拍照识别小程序
import cv2 import requests import base64 from PIL import Image, ImageDraw, ImageFont import numpy as np import time # 设置OCR服务地址 OCR_URL = "http://ip:8089/api/tr-run/" def capture_and_recognize(): # 初始化摄像头 cap = cv2.VideoCapture(0) print("按空格键拍照,ESC键退出") while True: ret, frame = cap.read() if not ret: print("无法获取摄像头画面") break # 显示实时画面 cv2.imshow("拍照识别 - 按空格拍照", frame) key = cv2.waitKey(1) # 按ESC退出 if key == 27: break # 按空格拍照并识别 elif key == 32: # 保存临时图片 temp_file = "temp_capture.jpg" cv2.imwrite(temp_file, frame) print("拍照成功,正在识别...") # 调用OCR接口 try: with open(temp_file, "rb") as f: img_base64 = base64.b64encode(f.read()).decode() data = { 'img': img_base64, 'compress': 800 # 压缩图片加快识别速度 } response = requests.post(OCR_URL, data=data) result = response.json() if result['code'] == 200: # 显示识别结果 show_result(frame, result['data']['raw_out']) else: print(f"识别失败: {result['msg']}") except Exception as e: print(f"识别出错: {str(e)}") # 释放资源 cap.release() cv2.destroyAllWindows() def show_result(image, text_blocks): # 将OpenCV图像转换为PIL格式 image_pil = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) draw = ImageDraw.Draw(image_pil) # 使用中文字体(需要提前下载或使用系统自带字体) try: font = ImageFont.truetype("simhei.ttf", 20) except: font = ImageFont.load_default() # 绘制识别结果 for block in text_blocks: coords, text, confidence = block x1, y1, x2, y2 = coords # 绘制文字框 draw.rectangle([x1, y1, x2, y2], outline="red", width=2) # 绘制识别文字 draw.text((x1, y1-25), f"{text} ({confidence:.2%})", fill="red", font=font) # 转换回OpenCV格式显示 result_image = cv2.cvtColor(np.array(image_pil), cv2.COLOR_RGB2BGR) # 显示结果 cv2.imshow("识别结果", result_image) print("识别完成,按任意键返回拍照界面...") cv2.waitKey(0) cv2.destroyWindow("识别结果") if __name__ == "__main__": capture_and_recognize()
官方接口文档
https://github.com/alisen39/TrWebOCR/wiki/%E6%8E%A5%E5%8F%A3%E6%96%87%E6%A1%A3