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

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详解

  • 11
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV-Python是一个基于Python的计算机视觉库,它提供了许多用于图像处理和计算机视觉任务的函数和工具。在使用OpenCV-Python进行实战时,首先需要安装配套使用的opencv-contrib-python库,最好保持版本一致,可以使用以下命令进行安装:pip install opencv-contrib-python。 在实战中,可以通过OpenCV-Python进行图像的基本操作。例如,可以使用OpenCV-Python读取图像文件,可以使用cv2.imread函数来读取图像,如下所示:img = cv2.imread('image.jpg')。 另外,OpenCV-Python还可以用于处理视频文件。可以使用cv2.VideoCapture函数来打开视频文件,然后使用循环逐帧读取视频帧,并对每一帧进行处理。例如,可以将每一帧转换为灰度图像,并使用cv2.imshow函数显示处理结果。可以使用以下代码来实现视频文件的处理: ``` vc = cv2.VideoCapture('video.mp4') # 打开视频文件 while vc.isOpened(): ret, frame = vc.read() # 读取视频帧 if frame is None: break if ret == True: gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 将帧转换为灰度图像 cv2.imshow("result", gray) # 显示灰度图像 if cv2.waitKey(10) & 0xFF == 27: # 按下ESC键退出循环 break vc.release() cv2.destroyAllWindows() ``` 此外,OpenCV-Python还可以进行图像数据的截取,可以使用切片操作来截取图像的特定区域。例如,可以使用以下代码来截取图像的一部分数据:cat = img[0:50, 0:200],其中[0:50, 0:200]表示截取图像的高度为50像素,宽度为200像素的区域。 还可以使用OpenCV-Python提取图像的颜色通道。例如,可以使用以下代码来提取图像的蓝色通道:blue_channel = img[:, :, 0],其中[:, :, 0]表示提取图像的第0个通道,即蓝色通道。同样的方法可以用于提取其他颜色通道。 综上所述,OpenCV-Python提供了丰富的函数和工具,可以用于图像处理和计算机视觉任务的实战。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [基于pythonopencv的学习和实战](https://blog.csdn.net/weixin_44001965/article/details/112862177)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatgptT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值