python彩色字符视频代码
python将视频转换为全字符视频简介
如何简单的使用python来实现将一部视频转换为字符画视频的效果。
其实,大家都知道视频就是一帧一帧的图片构成的。
那么如今我们想要实现,将视频转换为字符视频,那么是不是可以认为只要将一部视频全部逐帧拆解成图片,然后采取和以前相同的将图片转换为字符画的算法即可。然后在将这些图片按照原先的视频的格式封装起来就可以了。
既然有了想法,那接下来,自然是开始实际开发了。
代码
以下是相关部分的代码:
|
#-*- coding:utf-8 -*- import argparse import os import cv2 import subprocess from cv2 import videowriter,videowriter_fourcc,imread,resize from pil import image, imagefont, imagedraw #命令行输入参数处理 parser = argparse.argumentparser() parser.add_argument( 'file' ) parser.add_argument( '-o' , '--output' ) parser.add_argument( '-f' , '--fps' , type = float , default = 24 ) #帧 parser.add_argument( '-s' , '--save' , type = bool , nargs = '?' , default = false, const = true) #是否保留cache文件,默认不保存 #获取参数 args = parser.parse_args() input = args. file output = args.output save = args.save fps = args.fps #像素对应ascii码 ascii_char = list ( "$@b%8&wm#*oahkbdpqwmzo0qlcjuyxzcvunxrjft/\|()1{}[]?-_+~<>i!li;:oa+>!:+. " ) #ascii_char = list("mnhq$oc67+>!:-. ") #ascii_char = list("mnhq$oc67)oa+>!:+. ") #将像素转换为ascii码 def get_char(r,g,b,alpha = 256 ): if alpha = = 0 : return '' length = len (ascii_char) gray = int ( 0.2126 * r + 0.7152 * g + 0.0722 * b) unit = ( 256.0 + 1 ) / length return ascii_char[ int (gray / unit)] #将txt转换为图片 def txt2image(file_name): im = image. open (file_name).convert( 'rgb' ) .jpg" alt="python彩色字符视频代码(python将视频转换为全字符视频)" border="0" /> raw_width = im.width raw_height = im.height width = int (raw_width / 6 ) height = int (raw_height / 15 ) im = im.resize((width,height),image.nearest) txt = "" colors = [] for i in range (height): for j in range (width): pixel = im.getpixel((j,i)) colors.append((pixel[ 0 ],pixel[ 1 ],pixel[ 2 ])) if ( len (pixel) = = 4 ): txt + = get_char(pixel[ 0 ],pixel[ 1 ],pixel[ 2 ],pixel[ 3 ]) else : txt + = get_char(pixel[ 0 ],pixel[ 1 ],pixel[ 2 ]) txt + = '\n' colors.append(( 255 , 255 , 255 )) im_txt = image.new( "rgb" ,(raw_width,raw_height),( 255 , 255 , 255 )) dr = imagedraw.draw(im_txt) #font = imagefont.truetype(os.path.join("fonts","汉仪楷体简.ttf"),18) font = imagefont.load_default().font x = y = 0 #获取字体的宽高 font_w,font_h = font.getsize(txt[ 1 ]) font_h * = 1.37 #调整后更佳 #imagedraw为每个ascii码进行上色 for i in range ( len (txt)): if (txt[i] = = '\n' ): x + = font_h y = - font_w dr.text((y,x),txt[i],font = font, fill = colors[i]) y + = font_w name = file_name print (name + ' changed' ) im_txt.save(name) #将视频拆分成图片 def video2txt.jpg" alt="python彩色字符视频代码(python将视频转换为全字符视频)" border="0" /> vc = cv2.videocapture(file_name) c = 1 if vc.isopened(): r,frame = vc.read() if not os.path.exists( 'cache' ): os.mkdir( 'cache' ) os.chdir( 'cache' ) else : r = false while r: cv2.imwrite( str (c) + '.jpg" alt="python彩色字符视频代码(python将视频转换为全字符视频)" border="0" /> txt2image( str (c) + '.jpg" alt="python彩色字符视频代码(python将视频转换为全字符视频)" border="0" /> r,frame = vc.read() c + = 1 os.chdir( '..' ) return vc #将图片合成视频 def
fourcc = videowriter_fourcc( * ".jpg" alt="python彩色字符视频代码(python将视频转换为全字符视频)" border="0" /> images = os.listdir( 'cache' ) im = image. open ( 'cache/' + images[ 0 ]) vw = cv2.videowriter(outfile_name + '.avi' ,fourcc,fps,im.size) os.chdir( 'cache' ) for image in range ( len (images)): #image.open(str(image)+'.jpg" alt="python彩色字符视频代码(python将视频转换为全字符视频)" border="0" /> frame = cv2.imread( str (image + 1 ) + '.jpg" alt="python彩色字符视频代码(python将视频转换为全字符视频)" border="0" /> vw.write(frame) print ( str (image + 1 ) + '.jpg" alt="python彩色字符视频代码(python将视频转换为全字符视频)" border="0" /> os.chdir( '..' ) vw.release() #递归删除目录 def remove_dir(path): if os.path.exists(path): if os.path.isdir(path): dirs = os.listdir(path) for d in dirs: if os.path.isdir(path + '/' + d): remove_dir(path + '/' + d) elif os.path.isfile(path + '/' + d): os.remove(path + '/' + d) os.rmdir(path) return elif os.path.isfile(path): os.remove(path) return #调用ffmpeg获取mp3音频文件 def video2mp3(file_name): outfile_name = file_name.split( '.' )[ 0 ] + '.mp3' subprocess.call( 'ffmpeg -i ' + file_name + ' -f mp3 ' + outfile_name,shell = true) #合成音频和视频文件 def video_add_mp3(file_name,mp3_file): outfile_name = file_name.split( '.' )[ 0 ] + '-txt.mp4' subprocess.call( 'ffmpeg -i ' + file_name + ' -i ' + mp3_file + ' -strict -2 -f mp4 ' + outfile_name,shell = true) if __name__ = = '__main__' : vc = video2txt.jpg" alt="python彩色字符视频代码(python将视频转换为全字符视频)" border="0" /> fps = vc.get(cv2.cap_prop_fps) #获取帧率 vc.release()
input .split( '.' )[ 0 ],fps) print ( input , input .split( '.' )[ 0 ] + '.mp3' ) video2mp3( input ) video_add_mp3( input .split( '.' )[ 0 ] + '.avi' , input .split( '.' )[ 0 ] + '.mp3' ) if ( not save): remove_dir( "cache" ) os.remove( input .split( '.' )[ 0 ] + '.mp3' ) os.remove( input .split( '.' )[ 0 ] + '.avi' ) |
流程图
这次python编程的流程图如下:
注意事项
在编程的过程中有需要注意的几点:
- 这次编程使用到了opencv库,需要安装
- 帧率的获取可以通过这个函数——fps = vc.get(cv2.cap_prop_fps)
- 合成后的视频是没有声音的,我们使用ffmpeg进行合成
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。
原文链接:https://blog.csdn.net/kongfu_cat/article/details/79681719