OpenCV+Tesseract文本检测
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)# 调用
**效果显示**
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()
**单词检测效果显示**
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详解