当前位置: 首页 > news >正文

[OCR]Python 3 下的文字识别CnOCR

目录

1  CnOCR

2 安装

3 实践


1  CnOCR

CnOCR 是 Python 3 下的文字识别Optical Character Recognition,简称OCR)工具包。

工具包支持简体中文繁体中文(部分模型)、英文数字的常见字符识别,支持竖排文字的识别。同时,自带了20+个训练好的识别模型,适用于不同应用场景,安装后即可直接使用。

同时,CnOCR也提供简单的训练命令供使用者训练自己的模型。

 2 安装

安装cnocr的命令如下:

pip --default-timeout=100 install cnocr -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

下述的字体文件用于实践中的中文识别结果的展示。

①字体文件

    SimSun:宋体

    Microsoft YaHei:微软雅黑

    FangSong:仿宋

    KaiTi:楷体

    STXihei:华文细黑

    STSong:华文宋体

    STKaiti:华文楷体

    STFangsong:华文仿宋

    SimHei:黑体

②下载地址

部分中文字体文件下载

链接: https://pan.baidu.com/s/1pCEreBBHPJKLmWPJmh4OPg 提取码: hope

 3 实践

  • ①代码
from cnocr import CnOcr
import matplotlib.pyplot as plt
from PIL import Image, ImageDraw, ImageFont
import cv2
import numpy as np
def get_bbox(array):"将结果中的position信息的四个点的坐标信息转换"x1 = array[0][0]y1 = array[0][1]pt1 = (int(x1), int(y1))x2 = array[2][0]y2 = array[2][1]pt2 = (int(x2), int(y2))return pt1, pt2
def dealImg(img):b, g, r = cv2.split(img)img_rgb = cv2.merge([r, g, b])return img_rgb
def create_blank_img(img_w, img_h):blank_img = np.ones(shape=[img_h, img_w], dtype=np.int8) * 255# blank_img[:, img_w - 1:] = 0blank_img = Image.fromarray(blank_img).convert("RGB")blank_img = blank_img.__array__()return blank_img
def Draw_OCRResult(blank_img, pt1, pt2, text):cv2.rectangle(blank_img, pt1, pt2, color=[255, 255, 0], thickness=3)data = Image.fromarray(blank_img)draw = ImageDraw.Draw(data)fontStyle = ImageFont.truetype("ChineseFonts/simsun.ttc", size=30, encoding="utf-8")(x, y) = pt1draw.text((x+5, y+5), text=text, fill=(0, 0, 0), font=fontStyle)blank_img = np.asarray(data)# cv2.putText(img, temp["text"], pt1, cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 0), 2)return blank_img
def _main(img_path):im = cv2.imread(img_path)img_h, img_w, _ = im.shapeblank_img = create_blank_img(img_w, img_h)# 所有参数都使用默认值ocr = CnOcr()result = ocr.ocr(img_path)# print(result)for temp in result:print(temp["text"])# print(temp["score"])pt1, pt2 = get_bbox(temp["position"])blank_img = Draw_OCRResult(blank_img, pt1, pt2, temp["text"])fig = plt.figure(figsize=(10, 10))im = dealImg(im)img = dealImg(blank_img)titles = ["img", "result"]images = [im, img]for i in range(2):plt.subplot(1, 2, i + 1), plt.imshow(images[i], "gray")plt.title("{}".format(titles[i]), fontsize=20, ha='center')plt.xticks([]), plt.yticks([])# plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)# plt.tight_layout()plt.show()fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':_main("test.png")pass
  • ①结果图

  • ②代码
from cnocr import CnOcr
from PIL import Image, ImageDraw, ImageFont
import cv2
import numpy as np
def get_bbox(array):"将结果中的position信息的四个点的坐标信息转换"x1 = array[0][0]y1 = array[0][1]pt1 = (int(x1), int(y1))x2 = array[2][0]y2 = array[2][1]pt2 = (int(x2), int(y2))return pt1, pt2
def dealImg(img):b, g, r = cv2.split(img)img_rgb = cv2.merge([r, g, b])return img_rgb
def create_blank_img(img_w, img_h):blank_img = np.ones(shape=[img_h, img_w], dtype=np.int8) * 255# blank_img[:, img_w - 1:] = 0blank_img = Image.fromarray(blank_img).convert("RGB")blank_img = blank_img.__array__()return blank_img
def Draw_OCRResult(blank_img, pt1, pt2, text):cv2.rectangle(blank_img, pt1, pt2, color=[255, 255, 0], thickness=3)data = Image.fromarray(blank_img)draw = ImageDraw.Draw(data)fontStyle = ImageFont.truetype("ChineseFonts/simsun.ttc", size=30, encoding="utf-8")(x, y) = pt1draw.text((x+5, y+5), text=text, fill=(0, 0, 0), font=fontStyle)blank_img = np.asarray(data)# cv2.putText(img, temp["text"], pt1, cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 0), 2)return blank_img
def _main(img_path):im = cv2.imread(img_path)img_h, img_w, _ = im.shapeblank_img = create_blank_img(img_w, img_h)# 所有参数都使用默认值ocr = CnOcr()result = ocr.ocr(img_path)# print(result)for temp in result:print(temp["text"])# print(temp["score"])pt1, pt2 = get_bbox(temp["position"])blank_img = Draw_OCRResult(blank_img, pt1, pt2, temp["text"])images = np.concatenate((im, blank_img), axis=1)cv2.imwrite('OCR_result.jpg', images)
if __name__ == '__main__':_main("test.png")pass
  • ②结果图

茫茫人海,遇见便是缘,愿君事事顺心,一切都好。 感恩遇见!

相关文章:

  • CentOS 7 实战指南:目录操作命令详解
  • 随笔 | 写在年末冬日的夜里
  • Centos7:Jenkins+gitlab+node项目启动(1)
  • linux 网络系统管理 技能大赛 nginx fastCGI配置
  • 透彻掌握GIT基础使用
  • trino-435: 理论基础
  • uniApp中uView组件库的丰富布局方法
  • 【c++】遍历一棵树来获取信息,并根据这些信息用map生成另一棵树,新树的键是string类型,值是char*类型
  • Kubernetes网络-VXLAN
  • gn入门(Chromium)
  • Windows电脑引导损坏?按照这个教程能修复
  • 第二十六周:学习笔记
  • Linux 安装 mysql【使用yum源进行安装】
  • Android 万能的RecyclerView适配器(BaseRecyclerViewAdapterHelper)
  • BloombergGPT—金融领域大模型
  • Angular 响应式表单之下拉框
  • Computed property XXX was assigned to but it has no setter
  • css布局,左右固定中间自适应实现
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • js ES6 求数组的交集,并集,还有差集
  • Node 版本管理
  • webpack4 一点通
  • 测试如何在敏捷团队中工作?
  • 从tcpdump抓包看TCP/IP协议
  • 缓存与缓冲
  • 前端技术周刊 2019-02-11 Serverless
  • 问题之ssh中Host key verification failed的解决
  • 我感觉这是史上最牛的防sql注入方法类
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • Python 之网络式编程
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​比特币大跌的 2 个原因
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #pragma data_seg 共享数据区(转)
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (js)循环条件满足时终止循环
  • (南京观海微电子)——I3C协议介绍
  • (一)Neo4j下载安装以及初次使用
  • (转)EXC_BREAKPOINT僵尸错误
  • ******IT公司面试题汇总+优秀技术博客汇总
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • @DataRedisTest测试redis从未如此丝滑
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [51nod1610]路径计数
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [Android View] 可绘制形状 (Shape Xml)
  • [AutoSar]工程中的cpuload陷阱(三)测试
  • [BROADCASTING]tensor的扩散机制
  • [IDF]被改错的密码
  • [IE9] IE9 beta版下载链接
  • [Kubernetes]8. K8s使用Helm部署mysql集群(主从数据库集群)
  • [LeetCode]—Anagrams 回文构词法
  • [LeetCode]—Implement strStr() 寻找子串匹配第一个位置 (KMP)
  • [na]wireshark抓包排错-tcp.flags.reset