• 这年头还不来尝试线稿图视频??


     🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝 

    🥰 博客首页:knighthood2001

    😗 欢迎点赞👍评论🗨️

    ❤️ 热爱python,期待与大家一同进步成长!!❤️

    👀给大家推荐一款很火爆的刷题、面试求职网站👀

    跟我一起来巩固基础和刷题吧

    先看后赞,已成习惯😁👍👍(只截取了一部分,怕截取太多,你们打开卡)

    目录

    前言

    1原始视频逐帧提取.py

    2原始视频音频提取.py

    3-1PIL批量转换细节帧线稿图.py

    3-2PIL批量转换边缘增强线稿图.py

    4PIL帧-视频合成.py

    5音视频合成最终有声完整视频.py

    总结


    前言

    入门opencv,欢笑快乐每一天

    大致思路和上篇文章的类似,这里采用了opencv+PIL+moviepy,最终制作了线稿图的带声音的MP4。

    这里我讲了一些关于PIL的知识:利用PIL库进行简单的图像操作,隔壁打王者的小孩子都在向我要素描图,快上车!!

    目录如下:需要准备一个视频

    代码主要分成以下几个部分:

            1原始视频逐帧提取

            2原始视频音频提取

            3-1PIL批量转换细节帧线稿图  3-2PIL批量转换边缘增强线稿图

            4PIL帧-视频合成

            5音视频合成最终有声完整视频

    注:需要更改的,笔者已经在代码中注释todo了。


    1原始视频逐帧提取.py

    1. import os
    2. import cv2
    3. # todo
    4. cap = cv2.VideoCapture('ikun.mp4')
    5. fps = cap.get(cv2.CAP_PROP_FPS)
    6. width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
    7. height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
    8. frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
    9. print('fps:', fps, '\n', 'width:', width, '\n', 'height:', height, '\n', 'frames:', frames)
    10. # todo
    11. path = 'ikun'
    12. if not os.path.exists(path):
    13. os.mkdir(path)
    14. i = 0
    15. while True:
    16. flag, frame = cap.read()
    17. filename = path + '/{}.jpg'.format(str(i))
    18. print(filename)
    19. cv2.imwrite(filename, frame)
    20. i = i + 1
    21. if i > int(frames):
    22. break

            在上篇文章中,笔者是直接将原始视频提取的帧继续边缘检测处理后保存为图片,而在这里,笔者就直接提取原视频的帧并不做修改保存。便于后续操作。 


    2原始视频音频提取.py

    1. import moviepy.editor as mp
    2. def extract_audio(videos_file_path):
    3. my_clip = mp.VideoFileClip(videos_file_path)
    4. my_clip.audio.write_audiofile(f'{videos_file_path.split(".")[0]}.mp3')
    5. # todo
    6. extract_audio('ikun.mp4')

    3-1PIL批量转换细节帧线稿图.py

    1. import os
    2. from PIL import Image
    3. from PIL import ImageFilter
    4. # todo 这里的path为之前逐帧提取的图片,new_path为新生成的线稿图保存的目录
    5. path = 'ikun'
    6. new_path = 'new_ikun1'
    7. if not os.path.exists(new_path):
    8. os.mkdir(new_path)
    9. # 输出原始目录图片数量
    10. a = os.listdir(path)
    11. b = len(a)
    12. print("原始目录图片数:", b)
    13. for i in range(b):
    14. '''细节'''
    15. square = Image.open(path + "/{}.jpg".format(i))
    16. square1 = square.filter(ImageFilter.DETAIL)
    17. '''轮廓'''
    18. square2 = square1.filter(ImageFilter.CONTOUR)
    19. square2.save(new_path + "/{}.jpg".format(i))
    20. print(new_path + "/{}.jpg".format(i))

    这里笔者采用了PIL中细节+轮廓的方式,提取线稿图(PIL提取线稿图,需要有轮廓这一步骤)

    图片变化展示

    3-2PIL批量转换边缘增强线稿图.py

    1. import os
    2. from PIL import Image
    3. from PIL import ImageFilter
    4. # todo 这里的path为之前逐帧提取的图片,new_path为新生成的线稿图保存的目录
    5. path = 'ikun'
    6. new_path = 'new_ikun2'
    7. if not os.path.exists(new_path):
    8. os.mkdir(new_path)
    9. # 输出原始目录图片数量
    10. a = os.listdir(path)
    11. b = len(a)
    12. print("原始目录图片数:", b)
    13. for i in range(b):
    14. '''边缘增强'''
    15. square = Image.open(path + "/{}.jpg".format(i))
    16. square1 = square.filter(ImageFilter.EDGE_ENHANCE)
    17. '''轮廓'''
    18. square2 = square1.filter(ImageFilter.CONTOUR)
    19. square2.save(new_path + "/{}.jpg".format(i))
    20. print(new_path + "/{}.jpg".format(i))

    同样的,笔者在这里只换了PIL的一个函数,采用边缘增强+轮廓的方式,大家可以去我之前博客看看,大家也可以自行去尝试,试出多种风格。

     利用PIL库进行简单的图像操作,隔壁打王者的小孩子都在向我要素描图,快上车!!

    图片变化展示:

     

    (不知道为啥,感觉这个更好看)


    4PIL帧-视频合成.py

    1. import cv2
    2. import os
    3. size = (854, 480)
    4. # todo path和保存的视频名称需要根据变化
    5. path = 'new_ikun1'
    6. videowrite = cv2.VideoWriter('output_ikun1.mp4', -1, 25, size)
    7. a = os.listdir(path)
    8. n = len(a)
    9. for i in range(n):
    10. img = cv2.imread(path + "/{}.jpg".format(i))
    11. videowrite.write(img)
    12. videowrite.release()
    13. print('end!')

    5音视频合成最终有声完整视频.py

    1. import moviepy.editor as mp
    2. # todo 路径都要看情况变化
    3. # todo 传入的线稿图视频
    4. video = mp.VideoFileClip('output_ikun1.mp4')
    5. audio = mp.AudioFileClip('ikun.mp3')
    6. video_merge = video.set_audio(audio)
    7. # todo 最终生成的带音频的视频
    8. video_merge.write_videofile('final_ikun1.mp4')
    9. # video = mp.VideoFileClip('output_ikun2.mp4')
    10. # audio = mp.AudioFileClip('ikun.mp3')
    11. # video_merge = video.set_audio(audio)
    12. # video_merge.write_videofile('final_ikun2.mp4')

    注:4和5都只是根据3-1的线稿图内容进行制作视频


    总结

            大致上已经讲完了,大家对这篇文章里面内容不熟悉的,可以看我前一篇文章,里面有详细讲解。

            接下来如果有空的话就会将其改为函数,方便大家更改与使用!!

            注:以上内容只是用来探讨🐔技术,方便大家对其产生兴趣!!

  • 相关阅读:
    TCP/IP 常见问题
    use .bat file to run python
    基于 HTML5/CSS3 制作漂亮的登录页面
    零基础学Linux内核之设备驱动篇(7)_字符设备_实验篇2
    [VNCTF2024]-Web:CheckIn解析
    vue 的常用事件
    开放平台架构指南
    第七届信息类研究生学术论坛参赛有感
    解密Prompt系列3. 冻结LM微调Prompt: Prefix-Tuning & Prompt-Tuning & P-Tuning
    2023年网络安全竞赛—内存取证解析
  • 原文地址:https://blog.csdn.net/knighthood2001/article/details/126175764