OpenCV杂谈_05
一. 需要做的前期准备
- 环境配置:
Python版本:3.9.0
功能包:opencv-python(4.5.2.52)
提前安装Tesseract_OCR工具,下载地址:http://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-setup-4.00.00dev.exe(切记:记录好Tesseract_OCR文件夹所安装的位置,作者这里为:C:\Program Files (x86)\Tesseract-OCR) - 需要自行搜索想要识别的图像,作为input;或者实时检测的情况下调用摄像头也可
- 一个用的顺手的IDE(本人推荐Pycharm)
二. 源码如下
import cv2
import pytesseract
# 将tesseract导入到OpenCV中(注意格式)
pytesseract.pytesseract.tesseract_cmd = "C:\\Program Files (x86)\\Tesseract-OCR\\tesseract.exe"
# 读取图像
img = cv2.imread('english.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # tesseract支持的是RGB格式图像,而OpenCV是BGR,因此需要将想要读取的图像转换为RGB格式
# print(pytesseract.image_to_string(img)) # 用于读取图片中的所有英文字母
# print(pytesseract.image_to_boxes(img)) # 用于输出假设字母上边有boundingbox,则Boundingbox的左上角坐标以及右下角坐标分别是什么
# 检测字符
hImg, wImg, _ = img.shape
boxes = pytesseract.image_to_boxes(img)
for box in boxes.splitlines():
# print(box) # 打印出图片中所有的英文字母以及它所对应的boundingbox的左上角点和右下角点
box = box.split(' ')
print(box) # 为了方便调用每一个相关的值,将每个字母及其boundingbox的左上角右下角坐标保存在一个列表中
x1, y1, x2, y2 = int(box[1]), int(box[2]), int(box[3]), int(box[4])
cv2.rectangle(img, (x1, hImg - y1), (x2, hImg - y2), (0, 0, 255), 2) # 给每一个字母画上所对应的框
cv2.putText(img, box[0], (x1, hImg - y1 - 90), cv2.FONT_ITALIC, 1, (50, 50, 255), 2) # 给每一个框上标记上检测出来的结果,根据想要写字符的位置进行对 (x1, hImg - y1 - 数字)中数字的修改
# 调用摄像头的实时字符检测 (想要使用本功能则将上边检测字符的代码块注释掉,将本段代码块恢复运行即可)
# cap = cv2.VideoCapture(0)
# cap.set(3, 640)
# cap.set(4, 480)
#
#
# def captureScreen(bbox=(300, 300, 1500, 1000)):
# capScr = np.array(ImageGrab.grab(bbox))
# capScr = cv2.cvtColor(capScr, cv2.COLOR_RGB2BGR)
# return capScr
#
#
# while True:
# timer = cv2.getTickCount()
# _, img = cap.read()
# # 检测画面中的字符
# hImg, wImg, _ = img.shape
# boxes = pytesseract.image_to_boxes(img)
# for b in boxes.splitlines():
# 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), (50, 50, 255), 2)
# cv2.putText(img, b[0], (x, hImg - y + 25), cv2.FONT_HERSHEY_SIMPLEX, 1, (50, 50, 255), 2)
# fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer)
# cv2.putText(img, 'FPS:' + str(int(fps)), (75, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (20, 230, 20), 2)
# cv2.imshow("Result", img)
# cv2.waitKey(1)
#
# 展示图像 (使用实时检测功能时要将该部分代码块注释掉)
cv2.imshow("Result", img)
cv2.waitKey(0)
三. 结果展示
- 非实时
- 实时
四. 感悟与分享
- 明显可以看出实时的检测结果很不稳定,且容易出错。
- 只对画面中字符的识别是远远不够的,需要做字符的联结(换句话说就是去主动地将字符做合理拼接成为单词),其实是有解决办法的,即使用pytesseract.image_to_data,但作者这里一直报错
Attribute Error:‘list’ object has no attribute 'read'
,且尚未解决,解决之后会第一时间进行更新。 - 参考课程及推荐:https://www.youtube.com/watch?v=6DjFscX4I_c(内容为英文,且需要翻墙)