# USAGE
# python ocr_video.py --input images/card.mp4 --output output/ocr_video_output.avi
# helpers.py: #工具类,将视频OCR脚本的输出作为单独的输出视频写入磁盘
# blur_detection: 子模块,检测视频流中的模糊帧
# video_ocr: 将视频ocr的结果写入单独的视频文件
# images/x.mp4:要进行ocr的视频文件
# output/x.avi: ocr结果的单独视频文件
# visualization.py: 可视化输出检测结果,包括3部分:1. 检测到名片且注释模糊/不模糊的原始输入框(顶部)
# 2. 检测到文本的名片的自顶向下转换(中间)
# 3. 自顶向下转换的OCR文本本身(底部)
# 导入必要的包
import argparse
import time
import cv2
import imutils
import numpy as np
import pytesseract # 提供Tesseract OCR的接口
from imutils.perspective import four_point_transform # (四点变换):应用透视变换,以获得正在OCR'ing的名片的自顶向下/鸟瞰视图
from imutils.video import VideoStream
from pytesseract import Output
from blur_detection.blur_detector import detect_blur_fft # fft模糊检测器
from pyimagesearch.helpers import addChiText # cv2.imshow添加中文
from pyimagesearch.helpers import cleanup_text # 清理OCR文本,去掉非ASCII字符,这样就可以使用cv2在输出图像上绘制OCR文本
from video_ocr.visualization import VideoOCROutputBuilder # 可视化生成器
# 构建命令行参数及解析
# --input 可选输入视频路径
# --output 可选输出视频路径,默认使用网络摄像头。
# --min-conf 过滤弱检测的置信度参数
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--input", type=str, default='images/card.mp4',
help="path to optional input video (webcam will be used otherwise)")
ap.add_argument("-o", "--output", type=str,
help="path to optional output video")
ap.add_argument("-c", "--min-conf", type=int, default=50,
help="minimum confidence value to filter weak text detection")
args = vars(ap.parse_args())
# 初始化videoOcrOutputBuilder,以轻松可视化
outputBuilder = None
# 初始化输出视频写入器和输出视频的空间维度
writer = None
outputW = None
outputH = None
# 创建一个命名的窗口,以进行输出Ocr可视化,以及设置窗口位置
# 使用cv2.moveWindow函数在屏幕上移动窗口。需要执行移动操作,因为输出窗口的大小是动态的——它将随着输出的增长和收缩而增长。
cv2.namedWindow("Output")
# 初始化一个布尔变量:显示使用Webcam还是输入视频文件
webcam = not args.get("input", False)
# 如果未提供视频路径,获取网络摄像头指针
if webcam:
print("[INFO] starting video stream...")
vs = VideoStream(src=0).start()
time.sleep(2.0)
# 否则,获取视频流指针
else:
print("[INFO] opening video file...")
vs = cv2.VideoCapture(args["input"])
# i = 0
# 遍历每一帧
while True:
# 获取摄像头/文件流的帧,并处理
orig = vs.read()
orig = orig if webcam else orig[1]
# 如果获取的是视频流文件,且没有获取到帧,则表示到达了文件末尾
if not webcam and orig is None:
break
orig = orig + 50 # 照片太暗,批量加亮50
orig = orig[200:700, :]
# 调整帧大小,计算新宽度与旧宽度的比率
# 将透视变换应用于原始高分辨率帧时,将需要此比率。
frame = imutils.resize(orig, width=500)
ratio = orig.shape[1] / float(frame.shape[1])
# 如果VideoOCROutputBuilder视频可视化器是None,初始化它
if outputBuilder is None:
outputBuilder = VideoOCROutputBuilder(frame)
# 初始化卡片和Ocr输出 ROIs
card = None
ocr = None
# 转换帧为灰度图,fft检测文本/文档模糊
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
(mean, blurry) = detect_blur_fft(gray, thresh=-9)
# 绘制是否模糊,模糊红色,不模糊绿色
color = (0, 0, 255) if blurry else (0, 255, 0)
text = "Blurry ({:.4f})" if blurry else "Not Blurry ({:.4f})"
text = text.format(mean)
cv2.putText(frame, text, (10, 25), cv2.FONT_HERSHEY_SIMPLEX,
0.7, color, 2)
# 卡片ROI将包含名片的自上而下转换(如果在当前帧中找到名片),而ocr将包含ocr文本本身。
# 只有当帧不模糊时,进行Ocr检测
if not blurry:
# cv2.imwrite("images/card" + str(random.randint(0, 100)) + ".jpg", orig)
# 使用高斯核对帧进行平滑,执行边缘检测
blurred = cv2.GaussianBlur(gray, (7, 7,), 0)
edged = cv2.Canny(blurred, 75, 200)
# 在边缘图中寻找轮廓,按面积大小倒序排列取前5个
# 名片将是具有四个顶点的输入帧中最大的ROI
cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)[:1]
# 初始化轮廓线列表和卡片对应
cardCnt = None
# 遍历轮廓
for c in cnts:
# # 近似轮廓
# peri = cv2.arcLength(c, True)
# approx = cv2.approxPolyDP(c, 0.02 * peri, True)
#
# # 如果有4个顶点,则认为找到了卡片的边缘线
# if len(approx) == 4:
# cardCnt = approx
# break
rect = cv2.minAreaRect(c)
box = cv2.boxPoints(rect)
box = np.int0(box)
cardCnt = box
# 如果找到了卡片,则进行ocr
if cardCnt is not None:
# 在帧上绘制轮廓线
cv2.drawContours(frame, [cardCnt], -1, (0, 255, 0), 3)
# 对原始的高分辨率图像应用透视变换(以便更好地进行OCR
# 对卡片应用4点透视变换以获取自上而下的鸟瞰图
card = four_point_transform(orig,
cardCnt.reshape(4, 2) * ratio)
# 开辟空间以用于可视化
ocr = np.zeros(card.shape, dtype="uint8")
# 转换颜色空间,以进行ocr
rgb = cv2.cvtColor(card, cv2.COLOR_BGR2RGB)
# lang=chi_sim+eng 检测中文+字母+数字
# --psm 11 检测稀疏编码
results = pytesseract.image_to_data(rgb,
lang='chi_sim+eng',
config='--psm 11',
output_type=Output.DICT)
# 使用ocr文本本身对输出ocr可视化进行注释
# 遍历每一个识别出的单独的文本
for i in range(0, len(results["text"])):
# 提取当前文本的边界框
x = results["left"][i]
y = results["top"][i]
w = results["width"][i]
h = results["height"][i]
# 提取文本和置信度值
text = results["text"][i]
conf = int(float(results["conf"][i]))
# 过滤弱检测
if conf > args["min_conf"]:
# 去除非ASCII码来处理文本
text = cleanup_text(text)
# 处理后的文本非空,在文本周围绘制边界框
if len(text) > 0:
cv2.rectangle(card, (x, y), (x + w, y + h),
(0, 255, 0), 2)
# cv2.putText(ocr, text, (x, y - 10),
# cv2.FONT_HE
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
blur_detector_image.py 图像模糊检测 blur_detector_video.py 实时视频流帧模糊检测 blur_detection/ blur_detector.py 实际进行检测的算法 images/ imgs/ output/ pyimagesearch/ ocr_video.py ocr实时视频流中的字 ocr_card.py ocr识别卡片上的字
资源推荐
资源详情
资源评论
收起资源包目录
detect_blur_fft.rar (88个子文件)
detect_blur_fft
ocr_video.py 9KB
pyimagesearch
__init__.py 51B
font
simsunb.ttf 16.27MB
simsun.ttc 10.01MB
simsunttc.rar 5.23MB
helpers.py 932B
__pycache__
__init__.cpython-37.pyc 144B
helpers.cpython-37.pyc 800B
blur_detector.py 3KB
blur_detection
__init__.py 0B
__pycache__
blur_detector.cpython-37.pyc 1004B
__init__.cpython-37.pyc 145B
blur_detector.py 3KB
blur_detector_image.py 3KB
output
ocr_video_output.avi 5.41MB
blur_detector_video.py 2KB
images
card87.jpg 64KB
card34.jpg 66KB
card17.jpg 64KB
card.jpg 64KB
card0.jpg 66KB
card79.jpg 65KB
card.mp4 975KB
card28.jpg 68KB
card53.jpg 65KB
card77.jpg 64KB
card75.jpg 63KB
card38.jpg 65KB
card58.jpg 64KB
card67.jpg 67KB
sm.jpg 5.38MB
flowert.jpg 3.65MB
card92.jpg 63KB
card23.jpg 64KB
card57.jpg 64KB
card4.jpg 63KB
card48.jpg 68KB
card33.jpg 67KB
imgs
40.jpg 16KB
43.jpg 16KB
44.jpg 16KB
2.jpg 29KB
41.jpg 16KB
42.jpg 16KB
27.jpg 17KB
10.jpg 30KB
28.jpg 17KB
47.jpg 16KB
25.jpg 17KB
13.jpg 30KB
39.jpg 16KB
46.jpg 16KB
14.jpg 31KB
30.jpg 17KB
6.jpg 29KB
22.jpg 32KB
45.jpg 16KB
36.jpg 17KB
1.jpg 29KB
17.jpg 32KB
35.jpg 17KB
21.jpg 32KB
ocr_video.gif 1.5MB
23.jpg 17KB
26.jpg 17KB
32.jpg 17KB
5.jpg 30KB
8.jpg 29KB
24.jpg 32KB
20.jpg 18KB
18.jpg 31KB
11.jpg 16KB
29.jpg 17KB
31.jpg 17KB
37.jpg 17KB
19.jpg 18KB
38.jpg 16KB
33.jpg 17KB
3.jpg 29KB
7.jpg 29KB
9.jpg 30KB
4.jpg 29KB
34.jpg 31KB
ocr_card.py 7KB
video_ocr
__init__.py 51B
visualization.py 2KB
__pycache__
visualization.cpython-37.pyc 1KB
__init__.cpython-37.pyc 140B
共 88 条
- 1
资源评论
程序媛一枚~
- 粉丝: 4w+
- 资源: 29
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功