【OpenCV-Python实战项目】01-OCR文本检测

news2024/9/25 12:32:49

OpenCV+Tesseract文本检测

  • 0.介绍
  • 1.基础功能实现
    • 1.1 字符检测
    • 1.2 单词检测
    • 1.3 只检测数字
  • 2.工程应用
    • 2.1 封装类
    • 2.2 屏幕截图识别
    • 2.3 视频文本检测(待优化)
  • 3.参考

0.介绍

(1)Tesseract是一个开源文本识别 (OCR)引擎,是目前公认最优秀、最精确的开源OCR系统,用于识别图片中的文字并将其转换为可编辑的文本。
(2)安装Tesseract:
(3)python中安装pytesseract(用于调用Tesseract并返回结果)

1.基础功能实现

默认图像读取如下,后续将在此基础上展开检测。

import cv2
import pytesseract

pytesseract.pytesseract.tesseract_cmd=r'C:\Program Files (x86)\Tesseract-OCR\tesseract.exe'
img=cv2.imread('data/1.jpg')
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
hImg,wImg,_=img.shape

1.1 字符检测

字符检测主要用到:boxes=pytesseract.image_to_boxes(img)
返回如下,注意用boxes的坐标系统是以图像左下角为原点,而OpenCV则是以图像左上角为原点坐标,不然会影响后续利用opencv绘制检测框以及添加文本。

M 61 257 129 320 0
u 144 256 182 303 0
r 196 257 222 305 0
注:从左到右依次是检测的字符(M),(61,257)表示M的左上角坐标,(129,320)表示M的右下角坐标

# 1.字符检测
def detectChar(img,draw=True):
    boxes=pytesseract.image_to_boxes(img)
    for b in boxes.splitlines():
        b=b.split(" ")				  #在每一行中分割,示意['M','61','257','129','320','0']
        x,y,w,h=int(b[1]),int(b[2]),int(b[3]),int(b[4])		    # x,y为boxes左上角'坐标,(w,h)为右下角坐标
        cv2.rectangle(img,(x,hImg-y),(w,hImg-h),(0,0,255),1)	# 这里绘制需要考虑两个坐标原点不同的影响
        # 将字符放在检测框下面
        cv2.putText(img,b[0],(x,hImg-y+25),cv2.FONT_HERSHEY_SIMPLEX,0.5,(50,50,255),2)
        # 绘制检测结果
    if draw:
        cv2.imshow('Result',img)
        key=cv2.waitKey(0)
        if key==ord('q'):
            cv2.destroyAllWindows()
      
detectChar(img)# 调用

                                                        **效果显示**

在这里插入图片描述

1.2 单词检测

**(1)用法说明:**检测单词:boxes=pytesseract.image_to_data(img),返回值如下,注意与上述字符检测pytesseract.image_to_boxes区分,此外需要注意返回的坐标值跟上述不太一样cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),1),这里似乎又跟opencv定义的坐标原点一致了。

level page_num block_num par_num line_num word_num left top width height conf text
1 1 0 0 0 0 0 0 914 368 -1
2 1 1 0 0 0 61 43 822 158 -1
3 1 1 1 0 0 61 43 822 158 -1
4 1 1 1 1 0 61 43 822 86 -1
5 1 1 1 1 1 61 43 386 69 89 Murtaza’s
5 1 1 1 1 2 476 44 407 85 91 Workshop
4 1 1 1 2 0 258 155 350 46 -1
5 1 1 1 2 1 258 155 224 46 89 Robotics
5 1 1 1 2 2 502 155 39 46 87 &
5 1 1 1 2 3 560 158 48 42 90 AI
2 1 2 0 0 0 28 289 852 44 -1
3 1 2 1 0 0 28 289 852 44 -1
4 1 2 1 1 0 28 289 852 44 -1
5 1 2 1 1 1 28 289 852 44 90 12345678910111213141

(2)完整代码:

def detectWord(img,draw=True):
    boxes=pytesseract.image_to_data(img)
    # print(boxes)
    for a,b in enumerate(boxes.splitlines()):
        # print(b)
        if a!=0:#从标题下一行开始打印
            b=b.split()
            if len(b)==12:# 若按照空格分割每行,有字符的长度一定是12
                # print(b)
                x,y,w,h=int(b[6]),int(b[7]),int(b[8]),int(b[9])#同理
                # cv2.rectangle:长方形框左上角坐标,右下角坐标
                cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),1)# 又是坐标注意问题,注意跟image_to_boxes区分
            # 将字符放在下面
                cv2.putText(img,b[11],(x,y-5),cv2.FONT_HERSHEY_COMPLEX,1,(50,50,255),2)
    if draw:
        cv2.imshow('Result',img)
        key=cv2.waitKey(0)
        if key==ord('q'):

            cv2.destroyAllWindows()
                                                       **单词检测效果显示**

在这里插入图片描述

1.3 只检测数字

检测数字跟检测字符类似,只是需要在boxes=pytesseract.image_to_boxes(img,config=conf)增加conf参数限制,使用说明见3.参考(4)

def detectDigital(img):
    conf=r'--oem 3 --psm 6 outputbase digits'
    boxes=pytesseract.image_to_boxes(img,config=conf)
    for b in boxes.splitlines():
        print(b)
        b=b.split(" ")
        x,y,w,h=int(b[1]),int(b[2]),int(b[3]),int(b[4])
        cv2.rectangle(img,(x,hImg-y),(w,hImg-h),(0,0,255),1)# 又是坐标注意问题
        cv2.putText(img,b[0],(x,hImg-y+25),cv2.FONT_HERSHEY_SIMPLEX,1,(50,50,255),2)
    cv2.imshow('Result',img)
    key=cv2.waitKey(0)
    if key==ord('q'):

        cv2.destroyAllWindows()

2.工程应用

2.1 封装类

import cv2
import pytesseract

pytesseract.pytesseract.tesseract_cmd=r'C:\Program Files (x86)\Tesseract-OCR\tesseract.exe'
class textOCR():
    def __init__(self):
        pass

    #1.字符检测:注意坐标问题
    def findChar(self,img,draw=True):
        boxes=pytesseract.image_to_boxes(img)# 注意这个输出是以图像左下角为原点,而opencv是左上角
        for b in boxes.splitlines():
            b=b.split(" ")
            x,y,w,h=int(b[1]),int(b[2]),int(b[3]),int(b[4])# x,y为boxes左上角坐标,(w,h)为右下角坐标
            cv2.rectangle(img,(x,hImg-y),(w,hImg-h),(0,0,255),1)
            # 将字符放在下面
            cv2.putText(img,b[0],(x,hImg-y+25),cv2.FONT_HERSHEY_SIMPLEX,0.5,(50,50,255),2)
        
        if draw:
            cv2.imshow('Result',img)
            key=cv2.waitKey(0)
            if key==ord('q'):
                cv2.destroyAllWindows()
        return boxes
    

2.2 屏幕截图识别

**(1)用法说明:**这里说的屏幕结果识别是指利用PIL库对当前电脑界面的进行截图并识别。这里仅用到封装类代码,与基础中的代码无关。
(2)代码:

import numpy as np
from PIL import ImageGrab
# 屏幕截图函数
def captureScreen(bbox=(300,300,1500,1000)):
	# bbox分别表示当前截取范围(坐标原点为屏幕左上角)
    capScr = np.array(ImageGrab.grab(bbox))

    capScr = cv2.cvtColor(capScr, cv2.COLOR_RGB2BGR)
    return capScr
    #接下来调用上述基础功能代码函数即可
OCR=textOCR()
img = captureScreen()#捕获当前图像
bbox=OCR.findChar(img)

(3)效果:

2.3 视频文本检测(待优化)

**(1)用法说明:**实时视频文本识别检测,但是有问题,延迟卡顿,且识别不出(正在优化)
(2)代码:

import time

def detectVideo():
    cap=cv2.VideoCapture(0)
    # cap.set(3,640)
    # cap.set(4,480)
    cTime=0
    pTime=0

    OCR=textOCR()

    while True:
        timer = cv2.getTickCount()
        _,img = cap.read()

    #     #DETECTING CHARACTERES
        hImg, wImg,_ = img.shape

        boxes=OCR.findChar(img,draw=False)
        for b in boxes.splitlines():
            b=b.split(" ")
            x,y,w,h=int(b[1]),int(b[2]),int(b[3]),int(b[4])# x,y为boxes左上角坐标,(w,h)为右下角坐标
            cv2.rectangle(img,(x,hImg-y),(w,hImg-h),(0,0,255),1)
            # 将字符放在下面
            #cv2.putText(img,b[0],(x,hImg-y+25),cv2.FONT_HERSHEY_SIMPLEX,0.5,(50,50,255),2)

        cTime=time.time()
        fps=1/(cTime-pTime)
        pTime=cTime
        cv2.putText(img,str(int(fps)),(10,70),cv2.FONT_HERSHEY_PLAIN,3,(255,0,255),3)
        cv2.imshow('Image',img)
        key=cv2.waitKey(1)
        if key==ord('q'):
            break
    cv2.destroyAllWindows()

detectVideo()

3.参考

(1)B站视频-01-OCR文本检测视频教程
(2)gitee代码仓库
(3)教程源地址cv zone(1)(2)均来自此正式教程。
(4)Python OCR工具pytesseract详解

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

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

相关文章

TypeScript数组

数组 数组 数据存储的集合 声明数组的两种方式 1.只声明不赋值 &#xff1a;let arr1:string[] <>泛型 数组在使用前先赋值 2.边声明边赋值 let arr3:string[][];//空数组 // [数据1,数据2,.....数据n]数据之间用,隔开 let arr4:string[][张三,李四,王五]; let ar…

A. Array

https://codeforces.com/gym/102875/problem/A p<30 可以建立30颗线段树维护 然后看操作 一.add 懒标记 二.mul 三.mi 好像不能找到 于是懒标记貌似不能做&#xff0c; 但是考虑结果都要mod p,所以数都在0-p之间 其实就是i-> (操作)%p的映射 那就不用维护别的标…

MySQL —— 约束

MySQL —— 约束 引言not nulluniqueprimary key —— 主键auto_increment复合主键 foreign key —— 外键插入数据删除主表的数据 default 引言 在设计表的时候&#xff0c;有些列是必填项&#xff08;如果用户不填&#xff0c;那这个数据就没有必要存进数据库&#xff09;&a…

GPT-5:未来已来,你准备好了吗?

GPT-5 一年半后发布&#xff1f;对此你有何期待&#xff1f; IT之家6月22日消息&#xff0c;在美国达特茅斯工程学院周四公布的采访中&#xff0c;OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布&#xff0c;给出了肯定答案并表示将在一年半后发布。此外&#xff0c;穆…

基于STM32的智能宠物喂食器

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码控制代码应用场景 宠物定时喂食远程控制喂食常见问题及解决方案 常见问题解决方案结论 1. 引言 智能宠物喂食器可以通过定时和远程控制&#xff0c;实现对宠物的科学喂养。本文将…

对抗生成:基于CycleGAN的风格迁移

对抗生成&#xff1a;基于CycleGAN的风格迁移 前言相关介绍CycleGAN 的工作原理核心思想主要组件训练目标 优点缺点应用实例总结 实验环境项目地址LinuxWindows 项目结构具体用法准备数据&#xff08;以vangogh2photo为例&#xff09;进行训练&#xff08;以vangogh2photo为例&…

【vulhub靶场之spring】——

简介&#xff1a; Spring是Java EE编程领域的一个轻量级开源框架&#xff0c;该框架由一个叫Rod Johnson的程序员在2002年最早提出并随后创建&#xff0c;是为了解决企业级编程开发中的复杂性&#xff0c;业务逻辑层和其他各层的松耦合问题&#xff0c;因此它将面向接口的编程思…

Shiro框架漏洞复现(附修复方法)

Apache Shiro是一个强大易用的Java安全框架&#xff0c;提供了认证、授权、加密和会话管理等功能。Shiro框架直观、易用&#xff0c;同时也能提供健壮的安全性。 在Shiro框架下&#xff0c;用户登陆成功后会生成一个经过加密的Cookie。其Cookie的Key的值为RememberMe&#xff0…

用Python实现超精准识别图片中的文字,零基础小白也能轻松学会!

将图片中的文字转换成可编辑的文本&#xff08;通常称为光学字符识别&#xff0c;Optical Character Recognition, OCR&#xff09;可以通过Python的一些库来实现。一个流行的OCR库是Tesseract-OCR&#xff0c;它可以通过Python的pytesseract库来调用。首先&#xff0c;你需要在…

【全国大学生电子设计竞赛】2021年B题

&#x1f970;&#x1f970;全国大学生电子设计大赛学习资料专栏已开启&#xff0c;限时免费&#xff0c;速速收藏~

3D,从无知到无畏

欢迎来到 PaQiuQiu 的空间 本文为【3D&#xff0c;从无知到无畏专栏目录】&#xff0c;方便大家更好的阅读! &#x1f680;~写在前面~ 近年来&#xff0c;3D视觉技术在众多领域飞速发展&#xff0c;除了智能机器人、自动驾驶、无人机等无人系统&#xff0c;在我们身边的AR、VR…

Nuxt2:强制删除window.__NUXT__中的数据

一、问题描述 在以前的一篇文章《Nuxt3: 强制删除__NUXT_DATA__的一种方式》中曾介绍了在Nuxt3中如何删除存在于页面id为__NUXT_DATA__的script节点中的数据。 此次&#xff0c;Nuxt2与Nuxt3不同在于它的数据是存在于window.__NUXT__&#xff0c;那么该如何处理呢&#xff1f;…

Python 动态进度条实现,多个实例来展示实现方式

目录 1. 使用 print 函数 2. 使用 tqdm 库 3. 自定义样式 4. 多进度条 5. 嵌套进度条 6. 更新频率控制 7. 动态描述 8. 自定义回调 9. 使用 click 库 10. 使用 rich 库 文末福利 文末赠免费精品编程资料~~ 在编写Python脚本时&#xff0c;特别是在处理长时间运行的…

PDF Guru Anki:一款以PDF为中心的多功能办公学习工具箱

PDF Guru Anki 是一个假想的工具箱&#xff0c;因为目前我没有关于这个具体产品的详细信息。但是&#xff0c;根据这个名字和一般的PDF工具箱功能&#xff0c;我可以想象一些可能的独特功能&#xff0c;这些功能可以包括&#xff1a; PDF 阅读器&#xff1a;提供高效的PDF阅读…

linux下的C++程序

1.安装g编译环境&#xff08;c&#xff09;、gcc编译环境&#xff08;c语言&#xff09; sudo yum install gcc或者gcc-c //安装gcc/g编译(用管理员权限弄&#xff09; 验证是否安装成功 gcc或者g --version //如果显示版本号&#xff0c;则表示安装成功 sudo yum remove g…

Go语言fmt包中print相关方法

Go语言的fmt包提供了多种打印相关的函数&#xff0c;主要用于在控制台或其他输出目标上格式化并输出数据。下面是一些常用的print相关方法的用途和区别&#xff1a; 1.fmt.Print() 功能: fmt.Print() 将参数的内容按默认格式输出到标准输出&#xff08;通常是控制台&#xff…

springcloud loadbalancer nacos无损发布

前言 故事背景 jenkins部署时总是会有几秒钟接口调用报错&#xff0c;观察日志是因为流量被下发到已下线的服务&#xff0c;重启脚本在停止应用之前先调用nacos注销实例api后再重启依然会短暂出现此问题。项目架构是springcloud alibaba,通过openfeign进行微服务之间调用&…

npm vs pnpm 之幽灵依赖

在之前的文章&#x1f4c4; 果断放弃npm切换到pnpm–节约磁盘空间&#xff08;256G硬盘救星&#xff09; 中有提及 npm 扁平化带来的幽灵&#x1f47b;依赖 问题&#xff0c;但没有特别展开&#xff0c;这段时间实际业务中遇到了该问题&#xff0c;特整理如下&#xff1a; ♨️…

Linux C 程序 【03】线程栈空间

1.开发背景 上一个篇章创建了线程&#xff0c;参考 FreeRTOS&#xff0c;每个线程都是有自己的内存空间&#xff0c;Linux上面也是一样的&#xff0c;这个篇章主要描述线程栈空间的设置。 2.开发需求 设计实验&#xff1a; 1&#xff09;创建线程&#xff0c;并配置线程内存大…

充电桩--直流充电桩方案详解

一、直流充电桩介绍 1、直流充电桩介绍 电动汽车市场数量的不断激增&#xff0c;为缓解消费者对其里程焦虑与充电焦虑&#xff0c;配置双向OBC可以实现快速充电&#xff0c;还可将电动汽车当作分布式储能站回馈电网帮助消峰填谷&#xff0c;通过DCFC为电动汽车高效充电&#…