代码搬运工的逆袭

代码搬运工的逆袭

0.介绍

(1)是一个开源文本识别 (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)
返回如下,注意用,而,不然会影响后续利用opencv绘制检测框以及添加文本。

# 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)# 调用

                                                        **效果显示**

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

1.2 单词检测

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

(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()
                                                       **单词检测效果显示**

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

1.3 只检测数字

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

08-11 02:00