摘要:在Python课上学习了将图片转换为字符画的代码,想看看可不可以把视频转换为字符画视频,便有了此次为期一周陆陆续续写的视频画代码。
整体思路
- 分离出构成视频的图片
- 对图片进行ASCII码的转换
- 将转换好的图片进行合成为视频
- 本次为了方便测试,未添加删除生成文件的代码,需要手动删除或者自己添加代码。
将像素转换为ASCII码
将像素转换为ASCII码是为了在后期上色以及转换为字符时加以区别。
1 | def get_char(r,g,b,alpha = 256): |
此函数的输入的图片的三基色加上透明度,分别为R,G,B,ALPHA。此处会在后面用pixel = im.getpixel((j, i))来进行传递值。
其中ascii_char就是字符列表,用来将不同灰度的像素进行不同字符体替换的参照,大家可以参试用不同的字符来观察出最好的组合。ps:听说个数必须为32的倍数,我也没有进行尝试,有兴趣的小伙伴们可以探究下其中的原因。
alpha在为0的时候便是完全透明的图片,所以返回空,当他不为零时则将图片转换为灰度图像,此处运用
gray = 0.2126 * r + 0.7152 * g + 0.0722 * b
来将图片转换为灰度图像进行下面的ASCII输出。
将视频分隔成图片
1 | #将视频转换为图片 并进行计数,返回总共生成了多少张图片! |
可以看出来函数的传入值是vp = cv2.VideoCapture(video_path) 我将其放在主函数来进行输入,怕某些小伙伴没看见所以下其下写了备注。
1.isOpened()的用来检测资源是否在 VideoCapture()函数中打开。
2.os.chdir在PYTHON中的方法是用于改变当前工作目录到指定的路径。此处直接进入新创建的文件夹将生成的图片直接存入文件夹中。
3.返回number方便于后面的使用。
将图片转换为字符图片
此处分为两个函数进行(明明放在一起可以省事,课当初太懒了,懒得改了555)
1 | def star_to_char(number,save_pic_path): |
第一个函数相当于开始准备函数,其中传入的是上一个传出的总共生成多少个图片的统计number,还有字符图片存储的路径。
img_path_list 是用来存储图片相对路径的列表,采用内置for函数进行存储。
利用Image.open().size来获取图片大小,传入下面的转换函数。
1 | def img_to_char(image_path,raw_width,raw_height,task): |
要提醒的是,看下面代码:
1 | width = int(raw_width/ 6) |
如果要将图片进行转换必须把图片大小进行转换,否则转换出的代码必定会出现乱码。
dr = ImageDraw.Draw(im_txt)是opencv中创建画板的函数。
font_h是将字体进行调整,可以让生成的字符画视频更加的好康。
下面 for i in range(len(txt)):就是遍历txt按行按列进行写入图片,当遇到\n时推出并进行上色,最后将图片进行输出。
将图片合成为视频
1 | def jpg_to_video(char_image_path,FPS): |
此处最需要注意的是第二行的视频编码器,我进行了大量的测试,发现MP42是可以生成较小并且较小的视频文件的编码方式,具体详细参数可以参考
[]: https://blog.csdn.net/Archger/article/details/102868923
完整代码
1 | import cv2 |
注:转载请注明出处