原创首发
前段时间,有个武大学生做了一个樱花开放视频,视频正是由无数个“武汉加油”组成,非常激励人心。
这位学生也很友好地把代码跟大家分享了一下,感兴趣可以自己搜源代码学习下。


本人自己也研究了下,发现不难。实际上,作者将一个视频的每帧图片的像素值赋予字符,使之整体看起来像一幅画。
过程大致可以分为4步:
1.获取原视频每帧图片
2.将图片像素值(如颜色)赋予充满字符的文本
3.将文本转化成图片
4.将图片合并成视频
我将原作者100多行代码优化了下,30行搞定
代码如下:
from PIL import Image,ImageDraw,ImageFont
import cv2
import numpy
video= cv2.VideoCapture('football.mp4')
FrameNumber =video.get(7)
counts=0
fps = 30
newvideo = cv2.VideoWriter('new2.mp4', cv2.VideoWriter_fourcc(*'XVID'), fps, (360,360))
while True:
ret,image = video.read()
if ret:
image = image[:,:,(2,1,0)]
blank = Image.new("RGB", [len(image[0]),len(image)], "white")
drawObj = ImageDraw.Draw(blank)
n = 10
font = ImageFont.truetype('C:/Windows/Fonts/Microsoft YaHei UI/msyhbd.ttc',size=1)
for i in range(0, len(image),n):
for j in range(0, len(image[i]), n):
text = '*今条头日**'
drawObj.ink = image[i][j][0] + image[i][j][1]*256 + image[i][j][2]*256*256
drawObj.text([j,i], text[int(j/n)%len(text)],font=font)
img = cv2.cvtColor(numpy.asarray(blank),cv2.COLOR_RGB2BGR)
newvideo.write(img)
counts+=1
print("转化进度",counts,"/",FrameNumber)
else:
break
print("结束")
newvideo.release()
我用“*今条头日**”字符和一个踢足球的视频做了演示,效果如下:
视频加载中...
喜欢的,给我点个赞好吗?