今天看到B站推送的罗翔老师的一期视频,是关于读书的,还有相关推送关于朋友的,深受触动。罗老师作为法考教师到网红UP主,除了虚构了一个“法外狂徒张三”的生动形象来展现其强大的专业授课能力之外,讲的很多鸡汤和道理我也很有认同感。所以,看完视频,我有个强烈的念头,就是要把视频内容保存下来,形成文字版。于是,就有了下面这篇文章。
第一步:视频分帧到图片
这个是cv2的强项,也就是opencv-python库的基本操作。
importcv2title="我们为什么要读书?"vd=cv2.VideoCapture(title+.flv)res,image0=vd.read()#image0就是第一帧的图片
其它帧只要重复执行vd.read()即可,每次读取一张。
第二步:截取字幕二值化
我们最终的思路是截取出每帧的字幕,然后去OCR,所以先截取。
defgetBin(img):cropped=img[:,:]#裁剪坐标为[y0:y1,x0:x1]imgray=cv2.cvtColor(cropped,cv2.COLOR_BGR2GRAY)thresh=ret,binary=cv2.threshold(imgray,thresh,,cv2.THRESH_BINARY)#输入灰度图,输出二值图binary=cv2.bitwise_not(binary)#取反,文字变黑色returnbinary
如上第2行,就是截取部分,截取之后,我们写的这个函数还做了一个别的操作,就是先灰度化(去掉彩色,转为灰度图),再二值化(变成非黑即白的纯黑白图)。注意中间有一个重要的值——阈值,这个值要找一个平衡,这样才能保证字幕文字之外的颜色信息越少,同时文字还不能太虚化。这里我们只是为了实现的话,可以暂时不求甚解,回头可以慢慢研究。
至此得到的图片如下:
第三步:精确筛选去重复
这时有一个问题,就是字幕重复问题,这个flv视频的帧率是每秒30张,也就是说,如果一句话他说了2秒,就会截取出60张同字幕文字的图,写入起来大大降低处理效率。所以,我们编写以下算法,来判断上一张图片和下一张图片的黑点占比差,临近同字幕字的图片,应该这个差值是极小的,所以我取了0.01,效果欠佳还是干掉了很多不该去的图,所以调整为更少的0.。
whileres:res,image1=vd.read()binary1=getBin(image1)br1=np.sum(binary1==0)/(*)print(br1)(score,diff)=structural_similarity(binary0,binary1,full=True)ifabs(br1-br0)0.and0.8br10.01:#接近全黑全白的去,上张重的去count=count+1print("writeimage"+str(count))cv2.imwrite("whyRead/"+str(count)+.jpg,binary1)image0=image1br0=br1cv2.waitKey(1)
当然,图片相似度检查其实是门学问,有直方图对比法、结构对比法、余弦值对比法等等,现成可调用库有skimage.metrics,效果和我们上面相当。最终得到了稍有重复的图片目录。
第四步:文字识别得文章
好久没用百度的ocr,发现免费的没的用了,原来是每天个图,现在最大的优惠是每月条,肯定不够。于是转投了科大迅飞,这个是3个月10万试用条目,足够了。
代码方面,直接用示例代码,顶多加个异常处理,处理空图片提交问题:
"""印刷文字识别WebAPI接口调用示例接口文档(必看):
转载请注明:http://www.budanx.com/xwzdhg/9520.html