抖音字符视频在去年火过一段时间。
反正我是始终忘不了那段极乐净土的音乐...
这一次自己也来实现一波,做一个字符视频出来。
主要用到的库有cv2,pillow库。
原视频如下,直接抖音下载的,妥妥的水印。
https://v.qq.com/x/page/p0845ze916t.html
不过并不影响本次的操作。
/ 01 / 视频转图片
在Pycharm上直接安装cv2库是成功不了的,具体什么原因我也不清楚。
经过我的实践,发现只需在Pycharm的虚拟环境下。
运行下面这个命令,即可成功安装cv2这个库。
pip3 install opencv-python
不过还是会出现下载速度过慢,导致超时。
如果实在不行就可以去官网,下个.whl格式来安装。
视频转图片代码如下。
import cv2
import os
# 在当前目录下新建文件夹
folder_path = "img_bear/"
os.makedirs(folder_path)
# 进行视频的载入
vc = cv2.VideoCapture('bear.mp4')
c = 0
# 判断载入的视频是否可以打开
ret = vc.isOpened()
# 循环读取视频帧
while ret:
c = c + 1
# 进行单张图片的读取,ret的值为True或者Flase,frame表示读入的图片
ret, frame = vc.read()
if ret:
# 存储为图像
cv2.imwrite('img_bear/'+str(c) + '.jpg', frame)
# 输出图像名称
print('img_bear/'+str(c) + '.jpg')
# 在一个给定的时间内(单位ms)等待用户按键触发,1ms
cv2.waitKey(1)
else:
break
# 视频释放
vc.release()
最后成功生成了369张图片。
呆萌呆萌的××熊,我是不知道什么品种的熊...
/ 02 / 图片转字符
普通图片转字符图片主要使用了pillow库。
对图片做灰度处理,然后根据图片像素点的灰度值,添加对应的字符。
具体代码如下。
from PIL import Image, ImageDraw, ImageFont
import numpy as np
import os
# 创建字符图片文件夹
folder_path = "bear/"
os.makedirs(folder_path)
for i in range(1, 1000):
filename = 'img_bear/' + str(i) + '.jpg'
# 字符列表
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~ <>i!lI;:,\"^`'. ")
# 判断图片是否存在
if os.path.exists(filename):
# 将图片转化为灰度图像,并重设大小
img_array = np.array(Image.open(filename).resize((70, 70), Image.ANTIALIAS).convert('L'))
# 创建新的图片对象
img = Image.new('L', (560, 560), 255)
draw_object = ImageDraw.Draw(img)
# 设置字体
font = ImageFont.truetype('consola.ttf', 10, encoding='unic')
# 根据灰度值添加对应的字符
for j in range(70):
for k in range(70):
x, y = k * 8, j * 8
index = int(img_array[j][k] / 4)
draw_object.text((x, y), ascii_char[index], font=font, fill=0)
name = 'bear/' + str(i) + '.jpg'
print(name)
# 保存字符图片
img.save(name, 'JPEG')
最后成功生成了字符图片。
和上面的原图一样,也是369张。
/ 03 / 字符转视频
接下来使用cv2库,将字符图片转化为视频。
具体代码如下。
import cv2
import os
# 设置视频编码器,这里使用使用MJPG编码器
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
# 输出视频参数设置,包含视频文件名、编码器、帧率、视频宽高(此处参数需和字符图片大小一致)
videoWriter = cv2.VideoWriter('bear_character.avi', fourcc, 20.0, (560, 560))
for i in range(1, 1000):
filename = 'bear/'+str(i)+'.jpg'
# 判断图片是否存在
if os.path.exists(filename):
img = cv2.imread(filename=filename)
# 在一个给定的时间内(单位ms)等待用户按键触发,100ms
cv2.waitKey(100)
# 将图片写入视频中
videoWriter.write(img)
print(str(i) + '.jpg' + ' done!')
# 视频释放
videoWriter.release()
最后成功生成字符视频。
这里懒得去添加原来的BGM,所以凑合着看吧。
https://v.qq.com/x/page/a0845e9en09.html
据说眯眼看,效果更佳。
/ 04 / 总结
相关的视频以及代码已上传公众号。
公众号回复「字符」即可获取。
最后在此给自己做的抖音视频拉个票~
看过上一期送书推文的读者应该知道,就是那个抖音视频大赛。
大家要是有兴趣也可以去参加,具体的见上条送书推文。
其中文末的视频是我做的,而且我也去参加了,能不能拿大奖就靠大家了。
公众号「数据森麟」的作者也参加了,了解这个公众号的读者,也可以去一睹大佬的真容,帮忙点赞,哈哈。
对于就开过一次赞赏的我而言,大家的抖音点赞就是对我最大的赞赏。
晚上的时候,还找了几个问过我问题的读者,帮忙点赞,大家也挺配合的。
其中有个小妹妹,手机上没抖音,还立马去下了一个,来帮我点赞。
心中有一种莫名的感动,感谢大家的支持。
具体的见上图,就是那个蓝色的模糊的视频,不过就视频的效果而言,应该堪称大片。
手机上有抖音的就帮忙点个赞,没抖音的就算啦。
毕竟少刷抖音,多看书。这句话,一点毛病也没有。
万水千山总是情,点个「好看」行不行。
··· END ···