[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:] = 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

  • ②结果图

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Elasticsearch源码】 分片恢复分析

带着疑问学源码,第七篇:Elasticsearch 分片恢复分析 代码分析基于:https://github.com/jiankunking/elasticsearch Elasticsearch 8.0.0-SNAPSHOT 目的 在看源码之前先梳理一下,自己对于分片恢复的疑问点: 网上对于E…

outlook邮箱群发邮件方法?邮箱如何群发?

outlook邮箱群发邮件如何使用?QQ邮箱设置群发的步骤? Outlook邮箱群发邮件:必要性 Outlook邮箱作为全球广泛使用的邮件服务之一,不仅提供了便捷的邮件收发功能,还支持多种附件、日历提醒及强大的联系人管理。Outlook…

Java集合/泛型篇----第五篇

系列文章目录 文章目录 系列文章目录前言一、说说LinkHashSet( HashSet+LinkedHashMap)二、HashMap(数组+链表+红黑树)三、说说ConcurrentHashMap前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通…

微信计数统计器

前段采用非注入Exui编写 分享页 后台采用ThinkPHP开发

3D视觉-相机选用的原则

鉴于不同技术方案都有其适用的场景,立体相机的选型讲究的原则为“先看用途,再看场景,终评精度”,合适的立体相机在方案中可以起到事半功倍的效果。从用途上来进行划分,三维视觉方案主要应用在两个方向:测量…

ChatGPT 对SEO的影响

ChatGPT 的兴起是否预示着 SEO 的终结? 一点也不。事实上,如果使用得当,它可以让你的 SEO 工作变得更加容易。 强调“正确使用时”。 你可以使用ChatGPT来帮助进行关键字研究的头脑风暴部分、重新措辞你的内容、生成架构标记等等。 但你不…

国产化软硬件升级之路:πDataCS 赋能工业软件创新与实践

在国产化浪潮的推动下,基础设施软硬件替换和升级的需求日益增长。全栈国产化软硬件升级替换已成为许多领域中的必选项,也引起了数据库和存储领域的广泛关注。近年来,虽然涌现了许多成功的替换案例,但仍然面临着一些问题。 数据库…

操作系统 全整理

第一章 第二章 进程控制 原语 进程创建 进程终止 进程阻塞和唤醒 进程切换 进程通信 共享数据空间 略过 消息传递 以格式化的消息通过发送、接收消息原语来进行数据交换 管道通信 什么是线程? 线程的实现方式 线程模型是由 线程的状态与转换 进程调度 高级调…

[2024区块链开发入门指引] - 比特币运行原理

一份为小白用户准备的免费区块链基础教程 工欲善其事,必先利其器 Web3开发中,各种工具、教程、社区、语言框架.。。。 种类繁多,是否有一个包罗万象的工具专注与Web3开发和相关资讯能毕其功于一役? 参见另一篇博文👉 2024最全面…

qs.stringify 使用arrayFormat属性 + allowDots的数据处理 - 附示例

qs:将url中的参数转为对象;将对象转为url参数形式 一、介绍 1、官方文档: https://github.com/ljharb/qs https://github.com/ljharb/qshttps://github.com/ljharb/qs 二、准备工作 1、安装依赖包 npm install qs --save 2、示例版本 &…

野火霸道-V2+3.2寸屏+FreeRTOS+LVGL移植

摘要 基于野火霸道-V23.2寸屏的开发板,下载器为STLINK分为两个版本,FreeRTOS和裸机版本 裸机 裸机准备 lvgl v8.2版本的源码野火的《触摸画板-3.2寸》与《基本定时器》的代码例程 移植 将基本定时器代码移植到触摸画板-3.2寸的例程中,…

爬取糖豆视频

爬虫案例积累,以爬取糖豆视频为例: 爬取视频类型的数据一般步骤: 1.点击media,刷新,播放一个视频,会刷新一个包,点击发现是播放视频的包, 2.复制这个包url中的关键字,在搜索框中进…

uniapp的css样式图片大小截图展示

目录 截取图片前截取图片后第一种方式&#xff1a;代码第二种方式&#xff1a;代码最后 截取图片前 截取图片后 第一种方式&#xff1a;代码 <view class"swiper-box-img"><image class"swiper-box-img-img" :src"item.file_path" mod…

【LLM】人工智能应用构建的十大预训练NLP语言模型

在人工智能领域&#xff0c;自然语言处理&#xff08;NLP&#xff09;被广泛认为是阅读、破译、理解和理解人类语言的最重要工具。有了NLP&#xff0c;机器可以令人印象深刻地模仿人类的智力和能力&#xff0c;从文本预测到情感分析再到语音识别。 什么是自然语言处理&#xf…

uni-app引入vant表单(附源码)

新建项目 下载安装vant npm i vant main.js引入 import { Form } from vant; import { Field } from vant;Vue.use(Form); Vue.use(Field);代码引入 <van-form submit"onSubmit"><van-fieldclass"rePwd"v-model"username"name"请…

AI电商时代开始:阿里能否反杀拼多多

“AI电商时代刚刚开始&#xff0c;对谁都是机会&#xff0c;也是挑战。” 针对阿里员工对于拼多多财报和电商等的讨论&#xff0c;马云在阿里内网罕见地参与了谈论并发言。 阿里巴巴一向雷厉风行&#xff0c;已打响了AI电商的“第一炮”。 根据《晚点LatePost》报道&#xff…

【Linux基础】8. 网络工具

文章目录 【 1. 查询网络服务和端口 】【 2. 网络路由 】【 3. 镜像下载 】【 4. ftp sftp lftp ssh】【 5. 网络复制 】 【 1. 查询网络服务和端口 】 全称作用netstat&#xff08;network statistics&#xff09;网络统计显示各种网络相关信息&#xff0c;如网络连接&#x…

ssm 宿舍管理系统

MD5加密&#x1f512; - SSM框架&#x1f3a8; - Layui框架&#x1f384;#### 实现功能 - [x] 管理员的登录与登出 - [x] 管理员,班级,学生,宿舍&#xff0c;卫生&#xff0c;访客各模块增删改查 - [x] 个别模块关联查询 - [x] 各个模块数据导出Excel

从零开始的 dbt 入门教程 (dbt-core 基础篇)

最近一直在处理数据分析和数据建模的事情&#xff0c;所以接触了 dbt 等数据分析的工具&#xff0c;国内目前对于 dbt 比较详细的资料不多&#xff0c;所以打算写四道五篇 dbt 相关的文章&#xff0c;本文属于 dbt 系列的第一篇&#xff0c;本篇主要阐述 dbt 一些基本概念&…

【python报错】UserWarning: train_labels has been renamed targets

UserWarning: train_labels has been renamed targetswarnings.warn(“train_labels has been renamed targets”) 这是一条 Python 警告信息&#xff0c;它表示 train_labels 这个变量已经被重命名为 targets&#xff0c;在将来的版本中可能会移除 train_labels。因此&#x…