(Python3) La animación de video a personaje para principiantes es súper detallada y práctica, ¡y la prueba profesional es efectiva!

Antes era para completar una tarea asignada por el profesor, sentí que la animación de video a personaje era más fácil de completar a primera vista, así que elegí este proyecto. Pero después de que lo hice, sentí que para los principiantes, realmente subestimaba al enemigo.
Encontré varios artículos relacionados en Internet, pero siempre sentí que las explicaciones no eran lo suficientemente detalladas. Los novatos son derrotados fácilmente por algunas cosas pequeñas. Hoy, resolví el contenido anterior por capricho y tomé prestado el código de Internet. Quiero ver el efecto inmediatamente. Los estudiantes solo necesitan cambiar la ruta del archivo de fuente del código en la línea 63 y la ruta del archivo de video que se convertirá en el código en la línea 129 a sus propias rutas.

Click para ver el video efecto realizado por la estación B:
https://b23.tv/av85345204

Primero, la biblioteca de Python a preparar y los módulos utilizados.

1. Descarga e instalación de la biblioteca PIL

descarga de almohadas: https://github.com/python-pillow/Pillow
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

Después de descomprimir el archivo, instale la almohada: https://jingyan.baidu.com/article/2a138328efc944074a134fd7.html
o
descargue e instale la biblioteca de almohadas de pycharm:
https://blog.csdn.net/qq_36693604/article/details/ 77581753

uso de la biblioteca de almohadas:
https://www.cnblogs.com/Lival/p/6211602.html

2. módulo de cierre

Explicación detallada de la biblioteca shutil:
https://www.cnblogs.com/sui776265233/p/9225417.html

módulo 3.os

Uso integral del módulo os:
https://www.cnblogs.com/heluobing/p/10963763.html

módulo 4.sys

https://blog.csdn.net/qq_38526635/article/details/81739321

5.ffmpeg

Descarga e instalación de ffmpeg:
https://www.chiser.cc/1406.html
Cómo usar ffmpeg:
https://www.cnblogs.com/leisure_chn/p/10297002.html
https://blog.csdn .net/u011330638/artículo/detalles/82392268

Puntos a los que prestar atención

1. La línea 62 de código, configuración de fuente
Verifique las fuentes en su computadora:
① Primero, busque "Mi PC" y abra el disco del sistema.
②En la bandeja del sistema, busque la carpeta "Windows".
③En el archivo "Windows", busque la carpeta "Fints", el contenido de esta carpeta son todas las fuentes de esta computadora.
④Abra la carpeta Fuentes para ver todas las fuentes.

Código fuente y artículos de referencia : https://zhuanlan.zhihu.com/p/44373317?utm_source=wechatMessage_article_bottom

enviar código fuente

from PIL import Image, ImageDraw, ImageFont
import os, sys
import shutil

# 灰阶值越大,取越后面的字符
symbols = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'.   ")

#生成字符画,在第104行调用!!!!!!
def ascii_art_convert(src_dir, dest_dir):   #ascii_art_convert('D:\\temp_thum', 'D:\\temp_ascii')
    print('开始生成...')
    picts_list = sorted(os.listdir(src_dir))   #返回文件或文件名并排序  src_file = 'D:\\apple.mp4'
    len_picts = len(picts_list)

    i = 1
    #输出所有缩略图文件和文件夹,对每一张图进行操作
    for picture in picts_list:
        (pixels, x_size, y_size) = load_picture(os.path.join(src_dir, picture))  #调用转灰度图函数

        #生成字符画图片,os.path.join(),将join()里面的参数拼接成一个完整得路径。windows默认用\拼接
        create_ascii_picture(pixels, symbols,os.path.join(dest_dir, picture), x_size, y_size)  #调用灰度图转字符画

        print('正在生成中... {0}/{1}'.format(i, len_picts))
        i += 1

#在第100行调用!!!!!!
#调用PIL库形成缩略图,也就是改变图片尺寸,为后面转字符画提高效率,并临时存储
def create_thumbnail(src_dir, dst_dir):
    picts_list = sorted(os.listdir(src_dir))

    for picture in picts_list:
        base_name = os.path.basename(picture)
        img = Image.open(os.path.join(src_dir, picture))
        size = 200, 200
        img.thumbnail(size, Image.ANTIALIAS)
        img.save(os.path.join(dst_dir, base_name))



#在第17行调用!!!!!!
#将图片转为灰度图
def load_picture(filename):

    # Gray = R*0.299 + G*0.587 + B*0.114  灰度公式
    #在这里直接调用PIL库实现
    img = Image.open(filename).convert('L')
    (x, y) = img.size

    pixels = list(img.getdata())
    img.close()
    return (pixels, x, y)


#在第21行调用!!!!!!
#将灰度图的每一个像素点替换为相应的字符
def create_ascii_picture(pixels, symbols, dest_name, x_size, y_size):
    scale = 4    # 长宽扩大倍数
    border = 1  # 边框宽度

    interval_pixel = 2     #原图片间隔多少个像素点来填充,使图片看起来不密集,提高转化时间

    img = Image.new('L',(x_size*scale + 2*border,y_size*scale + 2*border),255)
    fnt = ImageFont.truetype('C:\Windows\Fonts\Arial.ttf', int(scale*3))    #C:\Windows\Fonts\Arial.ttf  是计算机上字体的文件路径
    t = ImageDraw.Draw(img)

    x = border
    y = border
    for j in range(0, y_size, interval_pixel):
        for i in range(0, x_size, interval_pixel):
            t.text((x, y),symbols[int(pixels[j*x_size + i]/256 * len(symbols))],font=fnt,fill=0)
            x += scale * interval_pixel
        x = border
        y += scale * interval_pixel

    img.save(dest_name, "JPEG")    #将所有替换后的字符画成一张字符画

#创建目录
def start_convert(src_file):

    if not os.path.exists('D:\\temp_pic'):
        os.mkdir('D:\\temp_pic')

    if not os.path.exists('D:\\temp_thum'):
        os.mkdir('D:\\temp_thum')

    if not os.path.exists('D:\\temp_ascii'):
        os.mkdir('D:\\temp_ascii')


    #分离音频
    slice_audio_cmd = 'ffmpeg.exe -i {0} -vn D:\\temp.mp3'.format(src_file)  #D:\\temp.mp3是临时保存分离音频的路径
    os.system(slice_audio_cmd)    #os.system()将字符串转化为命令在服务器上运行

    #分割视频为若干图片
    slice_pic_cmd = 'ffmpeg.exe -i {0} -r 24 D:\\temp_pic/%06d.jpeg'.format(src_file)  #分割图片的命令,D:\\temp_pic临时是保存切割好的图片的路径
    os.system(slice_pic_cmd)


    #生成缩略图
    create_thumbnail('D:\\temp_pic', 'D:\\temp_thum')     #调用了前面定义的函数 D:\\temp_thum是临时保存缩略图的路径


    #生成字符画
    ascii_art_convert('D:\\temp_thum', 'D:\\temp_ascii')    #调用了前面定义的函数,保存字符画图片D:\\temp_ascii

    #合成字符视频
    dst_name = os.path.join(os.path.dirname(src_file), 'ascii_' + os.path.basename(src_file))    #os.path.dirname(path)
    merge_ascii_video_cmd = 'ffmpeg -threads 2 -start_number 000001 -r 24 -i {0}/%06d.jpeg -i D:\\temp.mp3 -vcodec mpeg4 {1}'.format('D:\\temp_ascii', dst_name)
    os.system(merge_ascii_video_cmd)

    print('生成完成!')

#删除一些临时的文件及文件夹
    if os.path.exists('D:\\temp_pic'):
        shutil.rmtree('D:\\temp_pic')     #递归地删除分割视频得到的图

    if os.path.exists('D:\\temp_thum'):
        shutil.rmtree('D:\\temp_thum')    #递归地删除缩略图文件

    if os.path.exists('D:\\temp_ascii'):
        shutil.rmtree('D:\\temp_ascii')  # 递归地删除字符画图片

    if os.path.exists('D:\\temp.mp3'):
        os.remove('D:\\temp.mp3')


if __name__ == '__main__':
    src_file = 'D:\\BadApple.mp4'      #待转换视频的文件路径
    start_convert(src_file)   #调用函数

Supongo que te gusta

Origin blog.csdn.net/lic1697067085/article/details/104098893
Recomendado
Clasificación