难度分析:
字幕文字的字体、大小、色彩和透明度等因素影响
传统方法有:
字幕定位需要区分字幕区域和背景区域,有效的区分特征包括以下几点:
字幕的颜色、字体较为规整,且与背景有较为明显的颜色差异;
字幕区域的笔画丰富,角点和边缘特征比较明显;
字幕中字符间距固定,排版多沿水平或竖直方向;
同一视频中字幕出现的位置较为固定,且同一段字幕一般会停留若干秒的时间。
基于边缘密度的字幕定位:
首先,对于视频帧灰度图像进行边缘检测,得到边缘图。
然后,在边缘图上分别进行水平和竖直方向的投影分析,通过投影直方图的分布,大致确定字幕的候选区域。如果存在多个候选区域,则根据字幕区域的尺寸和宽高比范围滤除不合理的检测结果。
最后,通过多帧检测结果对比融合,进一步去除不稳定的检测区域。这样,基本可以得到可信的检测结果。
在某些复杂场景下,上述方法检测的区域可能会存在字幕边界检测不准的情况,尤其是垂直与字幕方向的两端边界。这时,可以进一步借助连通域分析的方法,求出字幕所在行区域的连通域,通过连通域的颜色、排列规整性来微调检测结果。
简单的应用——车牌识别
python opencv实现机器视觉基础技术python+opencv实现机器视觉基础技术(边缘提取,图像滤波,边缘检测算子,投影,车牌字符分割) - 一只帅气的IT小昂 - 博客园
字幕切换检测
截取字幕
def tailor(path1,path2,begin,end,step_size): #截取字幕
for i in range(begin,end,step_size):
fname1=path1 % str(i)
print(fname1)
img = cv2.imread(fname1)
print(img.shape)
cropped = img[500:600, 100:750] # 裁剪坐标为[y0:y1, x0:x1]
imgray = cv2.cvtColor(cropped, cv2.COLOR_BGR2GRAY)
thresh = 200
ret, binary = cv2.threshold(imgray, thresh, 255, cv2.THRESH_BINARY) # 输入灰度图,输出二值图
binary1 = cv2.bitwise_not(binary) # 取反
cv2.imwrite(path2 % str(i), binary1)
对字幕进行灰度处理,目的是使截取的字幕更加清晰。
深度学习方法:
自然场景文本检测识别技术综述
视觉领域常规物体检测方法(SSD, YOLO, Faster-RCNN等)直接套用于文字检测任务效果并不理想
深度学习时代的文字检测与识别技术
这些进展被分成 5 个类别:1)从语义分割和目标检测方法中汲取灵感,2)更简化的 Pipeline,3)处理任意形态文字,4)使用 Attention,5)使用合成数据
更简化的 Pipeline
旷视科技在 CVPR 2017 收录论文《EAST:An Efficient and Accurate Scene Text Detector》提出一种高度简化的 Pipeline 结构。
在精度和速度上都优于传统方法,且在精度和速度质检取得了极佳的平衡。EAST 已成为为行业标准方法,且代码开源,有趣的是,这是由热心网友 @argman 完成的(旷视贡献了部分代码)有兴趣的童鞋可以尝试;如果只想使用不想看源代码,目前 EAST 也作为官方模块,集成到最新版 OpenCV 之中。