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

news2024/11/27 16:26:30

目录

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:] = 0
    blank_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) = pt1
    draw.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.shape
    blank_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:] = 0
    blank_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) = pt1
    draw.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.shape
    blank_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

  • ②结果图

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1341766.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何实现内部产品权限集成

当前我国各领域正在加速向数字化、移动化、智能化发展,大力投入信息化建设与数字化转型已成为企业的共识,而企业门户系统是企业信息化系统建设是一个重要支撑,以企业业务系统为基础,搭建门户系统作为统一入口和应用中心可以有效支…

通过Python将PDF转为文本,快速提取PDF中的文字

快速高效地从PDF文档中提取信息对于专业人士来说非常重要。处理大量PDF文件时,将PDF转换为可编辑的文本格式可以节省时间和精力。而强大的Python语言正是在这些方面发挥其作用。利用Python中丰富的API,我们可以轻松在Python程序中将PDF转换为文本&#x…

YOLOv5改进 | 2023注意力篇 | BiFormer双层路由注意力机制(Bi-level Routing Attention)

一、本文介绍 BiFormer是一种结合了Bi-level Routing Attention的视觉Transformer模型,BiFormer模型的核心思想是引入了双层路由注意力机制。在BiFormer中,每个图像块都与一个位置路由器相关联。这些位置路由器根据特定的规则将图像块分配给上层和下层路…

重装系统以后无法git跟踪

总结:权限问题 故障定位 解决方案: 复制一份新的文件夹。(新建的文件创建和写入权限都变了) 修改文件为新的用户 执行提示的命令

【iOS安全】越狱iOS安装Frida | 安装指定版本Frida

越狱iPhone安装Frida 本文的方法适用于已越狱的iPhone手机 打开Cydia,软件源,编辑(右上角),添加(左上角):https://build.frida.re 然后搜索Frida,点击安装 参考&#x…

gzip引入后node_modules中.cache compression-webpack-plugin占用内存过多

1.Gzip Gzip(GNU zip)是一种常见的文件压缩格式和压缩算法,通常用于在 Web 服务器上对静态资源文件进行压缩,以减小文件大小并加快文件传输速度。在前端开发中,经常会使用 Gzip 压缩来优化网站的性能。 Gzip 压缩通过…

3D动态路障生成

3D动态路障生成 介绍设计实现1.路面创建2.空物体的创建3.Create.cs脚本创建 总结 介绍 上一篇文章介绍了Mathf.Lerp的底层实现原理,这里介绍一下跑酷类游戏的动态路障生成是如何实现的。 动态路障其实比较好生成,但是难点在哪里,如果都是平面…

18-网络安全框架及模型-信息系统安全保障模型

信息系统安全保障模型 1 基本概念 信息系统安全保障是针对信息系统在运行环境中所面临的各种风险,制定信息系统安全保障策略,设计并实现信息系统安全保障架构或模型,采取工程、技术、管理等安全保障要素,将风险减少至预定可接受的…

详解Vue3中的表单验证

本文主要介绍Vue3中的表单验证。 目录 普通语法setup语法注意事项 在Vue3中,表单验证可以使用Vue的内置指令v-model和自定义指令来实现。 普通语法 下面是一个详细介绍Vue3中表单验证的步骤: 创建Vue实例,并定义需要验证的表单数据。 imp…

网页在不同Android机表现有差异时需要排查页面样式是否针对主题模式作配置

前言 如题,这周有跟进一个BUG,后来分析出是跟手机主题模式有关。 bug情报:测试小年青那边提供的情报是我们的一个业务报告页面在某台华为手机上,页面列表项的文字颜色异常(正常是显示黑色)还有文字的背景显…

Springboot整合Elastic-job

一 概述 Elastic-Job 最开始只有一个 elastic-job-core 的项目,定位轻量级、无中心化,最核心的服务就是支持弹性扩容和数据分片!从 2.X 版本以后,主要分为 Elastic-Job-Lite 和 Elastic-Job-Cloud 两个子项目。esjbo官网地址 Ela…

gnu工程的编译 - 以libiconv为例

文章目录 gnu工程的编译 - 以libiconv为例概述gnu官方源码包的发布版从官方的代码库直接迁出的git版源码如果安装了360, 需要添加开发相关的目录到信任区生成 configrue 的方法备注END gnu工程的编译 - 以libiconv为例 概述 gnu工程的下载分2种: gnu官方源码包的发布版 这种…

java并发编程十四 Fork/Join

文章目录 Fork/Join Fork/Join 概念 Fork/Join 是 JDK 1.7 加入的新的线程池实现,它体现的是一种分治思想,适用于能够进行任务拆分的 cpu 密集型运算.所谓的任务拆分,是将一个大任务拆分为算法上相同的小任务,直至不能拆分可以直…

超详细深入理解YOLOv8配置参数:了解多种任务计算机视觉模型训练

目录 yolov8导航 YOLOv8(附带各种任务详细说明链接) ultralytics/ultralytics/cfg/default.yaml 训练模式和任务类型参数 训练参数 训练期间验证和测试参数 预测部分相关参数 可视化部分相关参数 模型导出部分相关参数 训练超参数相关参数 ult…

Android Studio实现课表

本文章主要展示课表的实现,里面包含很多控件的用法,比如吐司Toast、通知Notification、ListView,数值选择器NumberPicker,SeekBar同editText的关联。抽屉导航栏 还有一些其他的功能,比如InputFilter自定义的字符过滤器…

VSCode安装Go环境

VSCode安装Go 1.点击Go官网,根据自己环境下载go安装包,我这里为Windows 2.双击安装包,一直点击【Next】即可 VSCode配置Go基础环境 1.创建Go的工作目录: C:\Code\GoCode 2.创建Go的环境变量: GOPATH (1)右键【此电脑】,点击…

免费API-JSONPlaceholder使用手册

官方使用指南快速索引>>点这里 快速导览: 什么是JSONPlaceholder?有啥用?如何使用JSONPlaceholder? 关于“增”关于“改”关于“查”关于“删”关于“分页查”关于“根据ID查多个” 尝试自己搭一个?扩展的可能? 什么是JSONPlaceho…

【前端学习指南】开启 Vue 的学习之旅

🍭 Hello,我是爱吃糖的范同学 秋招终于结束了(拿到了比较满意的 offer🎉🎉🎉,后续也会有“面筋”系类给大家分享),目前我终于也有足够的时间和精力来完成我 23 年遗留下…

ubuntu 开机自报IP地址(用于无屏幕小车-远程连接)

目录 1.环境安装2.代码3.打包成可执行文件4.开启开机自启 1.环境安装 sudo apt-get install espeak #先安装这个库 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyttsx32.90 #再安装pyttsx3 pyinstaller pip install -i https://pypi.tuna.tsinghua.edu.cn/si…

【PXIE301-208】基于PXIE总线架构的Serial RapidIO总线通讯协议仿真卡

板卡概述 PXIE301-208是一款基于3U PXIE总线架构的Serial RapidIO总线通讯协议仿真卡。该板卡采用Xilinx的高性能Kintex系列FPGA作为主处理器,实现各个接口之间的数据互联、处理以及实时信号处理。板卡支持4路SFP光纤接口,支持一个PCIe x8主机接口&…