前言
一、环境配置
cmd输入python的时候跳转应用商店的解决方法。https://blog.csdn.net/qq_62294840/article/details/120623501
anaconda官方下载地址:https://www.anaconda.com/download-success
清华源下载地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
anaconda 界面https://blog.csdn.net/qq_44942936/article/details/104623714
pycharm环境配置。
pytharm中下载cv
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
https://blog.csdn.net/qq_52519271/article/details/130072076 这个方法不行!!!
二、文字识别
首先要安装库
参考这个文字https://blog.csdn.net/Castlehe/article/details/118751833
我 对他的文章进行简述。
首先下载这个https://digi.bib.uni-mannheim.de/tesseract/
然后点默认安装即可。
随后在安装目录下找到tesseract.exe这个文件,要是不在安装目录那就在c盘里面,可以直接用everything的软件找。
接着跟个那个博主的开始配置环境,但是我的虽然配置环境了,也还是执行不了。又看了这个https://www.python51.com/jc/17786.html
也还是不行。不过没有关系
我们在pycharm中来安装 pip install pytesseract
当安装完成以后呢写一个代码试试
import cv2
import pytesseract
也许你会报错,要是报错了也没关系
你在这样写
import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd ='C:\\ProgramData\\SOLIDWORKS\\SOLIDWORKS Inspection 2022 Standalone\TrainableOCR\\tesseract.exe'
我的这个目录是我的exe所在的位置,你只需要填写你的那个位置就可以了,不过你直接在windows的窗口中复制的是单个斜杠,我们再添一个写成我们那样就行了。
我们再随便搞一个图片例如:
2.1 文字单个识别
是否能够检测出文字
import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd ='C:\\ProgramData\\SOLIDWORKS\\SOLIDWORKS Inspection 2022 Standalone\TrainableOCR\\tesseract.exe'
img = cv2.imread('utool.png')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
print(pytesseract.image_to_string(img))
cv2.imshow('user',img)
cv2.waitKey(0)
中文需要去github上下载chi_sim的文件,然后放到对应文件夹后就可以了待写
2.2 文字单个带边框
接着让我们得到文字的位置和边框,我们一步步来
首先是文字位置和边框大小的识别
import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd ='C:\\ProgramData\\SOLIDWORKS\\SOLIDWORKS Inspection 2022 Standalone\TrainableOCR\\tesseract.exe'
img = cv2.imread('utool.png')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
# print(pytesseract.image_to_string(img))
print(pytesseract.image_to_boxes(img))
cv2.imshow('user',img)
cv2.waitKey(0)
可以看到有6个数,其中第一个代表字符,后面四个分别分别是x,y,w,h。
接着我们使用splitlines
函数来分割可以看这个讲解
boxes = pytesseract.image_to_boxes(img)
for b in boxes.splitlines():
print(b)
虽然我们得到了,但是不是一组组的数据我们没法使用所以,使用b.split(' ')
来进行数据的分割。
要注意的是得到w,h是对应的坐标不是长度!!!
boxes = pytesseract.image_to_boxes(img)
for b in boxes.splitlines():
b = b.split(' ')
print(b)
然后我们做框框。 首先要把字符型转化成int类型。
然后呢就是cv2.rectangle
函数可以看这个文章
主要就是
cv2.rectangle(img, pt1, pt2, color, thickness, lineType, shift )
参数表示依次为: (图片,长方形框左上角坐标, 长方形框右下角坐标, 字体颜色,字体粗细)
在图片img上画长方形,坐标原点是图片左上角,向右为x轴正方向,向下为y轴正方向。左上角(x,y),右下角(x,y) ,颜色(B,G,R), 线的粗细
一定要注意得到的值要用图片的高度减去 h ,因为从下往上。
hImg,wImg,_ = img.shape
boxes = pytesseract.image_to_boxes(img)
for b in boxes.splitlines():
b = b.split(' ')
print(b)
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,255,0),2)
然后在框框的旁边我们显示字符
主要用到的是cv2.putText
可以看这篇文章
简述
cv2.putText()
函数用法
cv2.putText(image, text, org, font, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])
参数
image:要在其上绘制文本的图像。
text:要绘制的文本字符串。
org:它是图像中文本字符串左下角的坐标。坐标表示为两个值的元组,即(X坐标值,Y坐标值)。
font:它表示字体类型。一些字体类型是FONT_HERSHEY_SIMPLEX,FONT_HERSHEY_PLAIN等。
fontScale:字体比例因子乘以font-specific基本大小。
color:它是要绘制的文本字符串的颜色。对于BGR,我们通过一个元组。例如:(255,0,0)为蓝色。
thickness:它是线的粗细像素。
lineType:这是一个可选参数,它给出了要使用的行的类型。
bottomLeftOrigin:这是一个可选参数。如果为true,则图像数据原点位于左下角。否则,它位于左上角。
字体选择
Python:cv.FONT_HERSHEY_SIMPLEX
normal size sans-serif font正常大小的无衬线字体
Python:cv.FONT_HERSHEY_PLAIN
small size sans-serif font小尺寸无衬线字体
Python:cv.FONT_HERSHEY_DUPLEX
normal size sans-serif font (more complex than FONT_HERSHEY_SIMPLEX)
正常大小的无衬线字体(比 FONT_HERSHEY_SIMPLEX 更复杂)
Python:cv.FONT_HERSHEY_COMPLEX
normal size serif font正常尺寸衬线字体
Python:cv.FONT_HERSHEY_TRIPLEX
normal size serif font (more complex than FONT_HERSHEY_COMPLEX)
正常大小的衬线字体(比 FONT_HERSHEY_COMPLEX 更复杂)
Python:cv.FONT_HERSHEY_COMPLEX_SMALL
smaller version of FONT_HERSHEY_COMPLEX
FONT_HERSHEY_COMPLEX 的较小版本
Python:cv.FONT_HERSHEY_SCRIPT_SIMPLEX
hand-writing style font手写风格字体
Python:cv.FONT_HERSHEY_SCRIPT_COMPLEX
more complex variant of FONT_HERSHEY_SCRIPT_SIMPLEX
FONT_HERSHEY_SCRIPT_SIMPLEX 的更复杂变体
Python:cv.FONT_ITALIC
flag for italic font斜体字体标志
import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd ='C:\\ProgramData\\SOLIDWORKS\\SOLIDWORKS Inspection 2022 Standalone\TrainableOCR\\tesseract.exe'
img = cv2.imread('utool.png')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
# print(pytesseract.image_to_string(img))
hImg,wImg,_ = img.shape
boxes = pytesseract.image_to_boxes(img)
for b in boxes.splitlines():
b = b.split(' ')
print(b)
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,255,0),2)
cv2.putText(img,b[0],(x,hImg-y+24),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2)
cv2.imshow('user',img)
cv2.waitKey(0)
现在我们已经能够得到每个字符了,但是不是字符串(word)。让我们来得到字符串
import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd ='C:\\ProgramData\\SOLIDWORKS\\SOLIDWORKS Inspection 2022 Standalone\TrainableOCR\\tesseract.exe'
img = cv2.imread('utool.png')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
# print(pytesseract.image_to_string(img))
hImg,wImg,_ = img.shape
boxes = pytesseract.image_to_data(img)
print(boxes)
cv2.imshow('user',img)
cv2.waitKey(0)
这样子让我们打印出这个
可以看到都是分裂的我们无法使用
可以看到,打印的第一行是没有用的,所以第一行不要那自然就可以用
for x,b in enumerate(boxes.splitlines()):
if x!=0:
来去除第一行
import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd ='C:\\ProgramData\\SOLIDWORKS\\SOLIDWORKS Inspection 2022 Standalone\TrainableOCR\\tesseract.exe'
img = cv2.imread('utool.png')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
hImg,wImg,_ = img.shape
boxes = pytesseract.image_to_data(img)
for x,b in enumerate(boxes.splitlines()):
if x!=0:
print(b)
cv2.imshow('user',img)
cv2.waitKey(0)
那么接着应该是把每一行都放在数组中。
其中的enumerate
就是枚举类似于计数器。看这篇文章
使用
for x,b in enumerate(boxes.splitlines()):
if x!=0:
b = b.split()
print(b)
这个就可以得到了,不过此时可以看到有些没有识别到字符串的也在里面,但是他们都是11个而有字符串的是12个那么
for x,b in enumerate(boxes.splitlines()):
if x!=0:
b = b.split()
if len(b)==12:
print(b)
和上面一样是画框框,但是不同的是image_to_data
得到的本别是左上角端点的位置,以及长宽的长度。
import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd ='C:\\ProgramData\\SOLIDWORKS\\SOLIDWORKS Inspection 2022 Standalone\TrainableOCR\\tesseract.exe'
img = cv2.imread('utool.png')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
# print(pytesseract.image_to_string(img))
hImg,wImg,_ = img.shape
boxes = pytesseract.image_to_data(img)
for x,b in enumerate(boxes.splitlines()):
if x!=0:
b = b.split()
if len(b)==12:
print(b)
cv2.rectangle(img,(int(b[6]),int(b[7])),(int(b[6])+int(b[8]),int(b[7])+int(b[9])),(0,255,0),2)
cv2.putText(img,b[11],(int(b[6]),int(b[7])),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2)
cv2.imshow('user',img)
cv2.waitKey(0)
还有只读取阿拉伯数字的配置可以看b站视频的24分左右的位置。