• 边缘检测生成(伪)手绘线稿风格的视频简易版教程


    效果视频演示

    用边缘检测制作的原神(伪)线稿风格PV

    用边缘检测制作的(伪)线稿风格原神PV

    准备工作

    为了表示方便,首先要在代码所在的目录下新建一个名为videos和一个名为new的文件夹

    提取视频帧

    其原理是用cv2读出视频,然后逐帧调用imwrite进行保存,这里有一个参数frameRate(帧率),表示每秒多少帧,因为我们是要生成和原来相似的视频,所以这里设置他的值为1

    import cv2
    import os
    
    path = "./videos"
    c = 1
    for name in os.listdir(path):
        cap = cv2.VideoCapture(os.path.join(path, name))
    
        frameRate = 1
    
        while (True):
            ret, frame = cap.read()
            if ret:
                if (c % frameRate == 0):
                    print("开始截取视频第:" + str(c) + " 帧")
                    # 这里就可以做一些操作了:显示截取的帧图片、保存截取帧到本地
                    cv2.imwrite(os.path.join(path, "%05d" % c + '.jpg'), frame)  # 这里是将截取的图像保存在本地
                c += 1
                cv2.waitKey(0)
            else:
                print("所有帧都已经保存完成")
                break
        cap.release()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    提取之后的结果是在videos文件夹中会保存每一帧的图片
    在这里插入图片描述
    我们打开其中一张来看看
    在这里插入图片描述

    边缘检测并保存

    其原理是调用cv2中的Canny进行边缘检测,并将检测后的结果保存

    import cv2
    import os
    from random import randint
    import numpy as np
    
    path = "./videos"
    line_color = (0, 0, 0)
    bg_color = (255, 255, 255)
    cnt = 1
    for name in os.listdir(path):
    
        img=cv2.imread(os.path.join(path, name))
        img1 = np.zeros((img.shape[0], img.shape[1], 3))
        i=cv2.Canny(img,80,120)
        img1[i!=255] = bg_color
        img1[i==255] = line_color
        cv2.imwrite(os.path.join("./new", name), img1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    运行结果是new文件夹中出现边缘检测后的图片
    在这里插入图片描述
    我们打开一张来看看
    在这里插入图片描述

    图像合成视频

    这里要注意一个size参数,这个参数是图片的大小。只需要将鼠标移动到图像上就可以查看图片的大小了,同时在cv2.VideoWriter中第三个参数是帧率,需要通过原视频的帧率设定,或者根据下一步提取出来的音频的长短尝试设定。

    import numpy as np
    import cv2
    import os
    
    path = r"./new"
    size = (1920, 1080)#这个是图片的尺寸,一定要和要用的图片size一致
    #完成写入对象的创建,第一个参数是合成之后的视频的名称,第二个参数是可以使用的编码器,第三个参数是帧率即每秒钟展示多少张图片,第四个参数是图片大小信息
    videowrite = cv2.VideoWriter(r'./videos/test.mp4',-1,60,size)#20是帧数,size是图片尺寸
    img_array=[]
    for filename in os.listdir(path):#这个循环是为了读取所有要用的图片文件
    
        img = cv2.imread(os.path.join(path, filename))
        if img is None:
            print(filename + " is error!")
            continue
        for i in range(1):
            videowrite.write(img)
    
    
    videowrite.release()
    print('end!')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    合成后我们会得到一个没有声音的视频
    在这里插入图片描述

    下面我们要把这个在videos文件夹下名为test.mp4的视频换一个文件夹,并且删除掉多余的图片,只留下原本的视频文件,然后进行音频的提取

    音频提取

    from moviepy.editor import AudioFileClip
    import os
    
    path = r"./videos"
    for name in os.listdir(path):
        my=AudioFileClip(os.path.join(path, name))
        my.write_audiofile(os.path.join(path, name.split(".")[-2]+".mp3"))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    视频和音频整合

    这里可以通过剪辑软件或者代码合成,但是考虑到我们并不可能完全了解视频原本的帧率,所以还是推荐用剪辑软件合成,这样可以更好的对比视频和音频的长度

    结尾

    边缘检测整个活
    在这里插入图片描述

    用边缘检测的方式打开:鸡你太美

    用边缘检测的方式打开:鸡你太美

  • 相关阅读:
    在Spring Boot项目中使用JPA
    PCL1.12.1 with QT6.3.2 编译部署
    自然语言处理的分类
    45-命令行基础操作
    【演讲干货满满】共话数智转型之路:斯歌应邀出席2023德莱维数字技术行业峰会
    【CSDN编程竞赛·第四期】个人参赛经历和个人建议
    Mac电脑BIM建模软件 Archicad 26 for Mac最新
    洛谷刷题C语言:PASCAL、Array、铝锤制作、Kaučuk、NASLJEDSTVO
    Python报错:ValueError: operands could not be broadcast together with shapes
    torch.cumprod实现累乘计算
  • 原文地址:https://blog.csdn.net/DuLNode/article/details/127724729