如何从滚动字幕视频中提取文本并保存为TXT文件?
从滚动字幕视频提取唯一文本的解决方案
问题描述
从视频逐帧OCR提取滚动字幕时,会因帧内容重复得到大量冗余文本,需要提取完整且唯一的字幕内容。
原代码的问题
原代码仅通过判断文本结尾是否带-来识别滚动字幕,但未做去重处理,导致重复文本大量累积;同时未利用定义的置信度阈值,也没有针对滚动字幕的跨行续接逻辑优化。
改进后的代码
import cv2 import easyocr # 初始化EasyOCR识别器(支持英文) reader = easyocr.Reader(['en']) # 打开目标视频文件 video = cv2.VideoCapture('path/to/video') # 配置关键参数 confidence_threshold = 0.65 # OCR结果置信度阈值 frame_skip = 5 # 跳帧间隔,减少重复检测 processed_lines = set() # 存储已处理的文本行,用于去重 current_partial_line = "" # 处理跨行续接的不完整文本 while True: ret, frame = video.read() if not ret: break # 跳帧处理,降低重复检测频率 if int(video.get(cv2.CAP_PROP_POS_FRAMES)) % frame_skip != 0: continue # 帧预处理:转灰度+二值化,提升OCR准确率 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 带置信度的OCR识别,保留细节用于过滤 results = reader.readtext(binary, detail=1, paragraph=True, text_threshold=0.50) for result in results: text = result[1] confidence = result[2] # 过滤低置信度结果 if confidence < confidence_threshold: continue # 处理跨行续接:如果当前有未完成的行,先拼接 if current_partial_line: text = current_partial_line.rstrip('-') + text current_partial_line = "" # 判断是否是不完整的行(结尾带-,说明下帧会续接) if text.endswith('-'): current_partial_line = text continue # 去重:仅保留未处理过的文本行 if text not in processed_lines: processed_lines.add(text) # 处理最后可能剩余的不完整行 if current_partial_line: processed_lines.add(current_partial_line.rstrip('-')) # 将唯一文本写入输出文件 with open('output.txt', 'w', encoding='utf-8') as f: for line in sorted(processed_lines): f.write(line + '\n')
关键改进点
- 跳帧处理:通过
frame_skip参数跳过部分帧,减少重复OCR的次数,提升效率 - 去重机制:用
processed_lines集合存储已提取的文本,避免重复内容写入 - 跨行续接处理:追踪末尾带
-的不完整行,和下一帧的对应文本拼接,保证内容完整 - 置信度过滤:利用定义的阈值过滤低可信度的OCR结果,提升文本准确性
- 文件写入优化:使用覆盖写入(
w模式)而非追加,避免多次运行时的内容重复
内容的提问来源于stack exchange,提问作者Akash Desai
相关产品推荐
相关产品推荐

