基于 PaddleOCR+OpenCV 实现图片 / 实时视频文字识别
一、 核心库介绍
PaddleOCR:百度飞桨开源的超轻量级 OCR 工具库,支持多语言识别、角度矫正,兼具高精度和高性能,是工业级 OCR 解决方案的首选。
OpenCV:开源的计算机视觉库,提供了图像读取、显示、绘制、视频流处理等丰富功能,是处理视觉数据的基础工具。
NumPy:Python 数值计算库,主要用于处理 OCR 识别结果中的坐标数据,完成数据类型转换和形状调整。
二、静态图片文字识别实现
from paddleocr import PaddleOCR
import cv2
import numpy as np
# 1. 初始化PaddleOCR实例
# use_angle_cls=True:启用文字角度矫正(解决文字旋转问题)
# use_gpu=False:禁用GPU(无GPU环境下使用)
# show_log=False:关闭日志输出,简化控制台信息
# lang='en':识别英文(识别中文需改为lang='ch')
ocr = PaddleOCR(use_angle_cls=True, use_gpu=False, show_log=False, lang='en')
# 2. 读取图片(OpenCV默认读取格式为BGR)
frame = cv2.imread("2.png")
# 3. 执行OCR识别
# cls=True:配合角度矫正,确保识别准确率
result = ocr.ocr(frame, cls=True)
# 4. 解析识别结果并可视化
# 判空:避免无识别结果时出现索引错误
if result and result[0] is not None:
for line in result[0]:
# line结构:[坐标列表, (识别文本, 置信度)]
# 4.1 转换坐标为整数(OpenCV绘制需要整数坐标)
pts_int = np.array(line[0], dtype=np.int32)
# 4.2 调整坐标形状为(4,1,2):符合OpenCV polylines的输入要求
pts = pts_int.reshape((-1, 1, 2))
# 4.3 绘制文字包围框(紫色,线宽2)
cv2.polylines(frame, [pts], isClosed=True, color=(147, 20, 255), thickness=2)
# 4.4 绘制识别文本(红色,字体大小1,线宽3)
cv2.putText(frame, line[1][0], (pts_int[0][0], pts_int[0][1]),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 3)
# 5. 显示标注后的图片
cv2.imshow('OCR Result', frame)
# 等待按键输入(按任意键关闭窗口)
cv2.waitKey(0)
# 释放窗口资源(避免内存泄漏)
cv2.destroyAllWindows()
1. 知识点
1.PaddleOCR 识别结果结构:result是嵌套列表,result[0]为单张图片的识别结果,每个line包含两部分:
line[0]:文字区域的 4 个顶点坐标([[x1,y1],[x2,y2],[x3,y3],[x4,y4]])
line[1]:元组(识别文本, 置信度),置信度越接近 1,识别越准确。
2.坐标处理:OpenCV 的绘图函数要求坐标为整数且形状为(n,1,2),因此需用np.int32转换类型,reshape调整形状。
3.判空逻辑优化:原代码if not None in result存在逻辑漏洞,改为if result and result[0] is not None,避免result为空列表时的报错。
三、实时视频流文字识别实现
from paddleocr import PaddleOCR
import cv2
import numpy as np
# 1. 初始化OCR实例(启用GPU加速,需确保环境支持)
ocr = PaddleOCR(use_angle_cls=True, use_gpu=True, show_log=False, lang='en')
# 2. 打开摄像头(0表示默认摄像头)
cap = cv2.VideoCapture(0)
# 3. 循环读取视频帧
while True:
# 读取一帧画面(ret为是否读取成功,frame为帧数据)
ret, frame = cap.read()
# 若读取失败(如摄像头断开),退出循环
if not ret:
break
# 4. 对当前帧执行OCR识别
result = ocr.ocr(frame, cls=True)
# 5. 解析并标注识别结果
if result and result[0] is not None:
for line in result[0]:
pts_int = np.array(line[0], dtype=np.int32)
pts = pts_int.reshape((-1, 1, 2))
# 绘制文字包围框
cv2.polylines(frame, [pts], isClosed=True, color=(147, 20, 255), thickness=2)
# 绘制识别文本(坐标取包围框左上角)
cv2.putText(frame, line[1][0], (pts_int[0][0], pts_int[0][1]),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 3)
# 6. 显示实时标注画面
cv2.imshow('Real-time OCR', frame)
# 7. 退出条件:按ESC键(ASCII码27)
if cv2.waitKey(1) == 27:
break
# 8. 释放资源(关键!避免摄像头被占用)
cap.release()
cv2.destroyAllWindows()
1. 知识点
1.视频流处理逻辑:通过cv2.VideoCapture(0)打开摄像头,while True循环持续读取帧,cap.read()返回(是否成功, 帧数据),需先判断ret是否为True。
2.实时性控制:cv2.waitKey(1)表示等待 1ms 获取按键输入,既保证视频流的实时性,又能监听退出按键(ESC)。
3.资源释放:循环结束后必须执行cap.release()释放摄像头,cv2.destroyAllWindows()关闭窗口,否则会导致摄像头被占用无法再次使用。
4.GPU 加速注意事项:use_gpu=True需满足两个条件:1.安装了 PaddlePaddle GPU 版;2. 显卡支持 CUDA,否则会报错,建议新手先设为False。
更多推荐


所有评论(0)