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

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

  • 效果视频演示
  • 准备工作
  • 提取视频帧
  • 边缘检测并保存
  • 图像合成视频
  • 音频提取
  • 视频和音频整合
  • 结尾

效果视频演示

用边缘检测制作的(伪)线稿风格纳西妲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()

提取之后的结果是在videos文件夹中会保存每一帧的图片
边缘检测生成(伪)手绘线稿风格的视频简易版教程_第1张图片
我们打开其中一张来看看

边缘检测并保存

其原理是调用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)

运行结果是new文件夹中出现边缘检测后的图片
边缘检测生成(伪)手绘线稿风格的视频简易版教程_第2张图片
我们打开一张来看看
边缘检测生成(伪)手绘线稿风格的视频简易版教程_第3张图片

图像合成视频

这里要注意一个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!')

合成后我们会得到一个没有声音的视频
边缘检测生成(伪)手绘线稿风格的视频简易版教程_第4张图片

下面我们要把这个在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"))

视频和音频整合

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

结尾

边缘检测整个活
边缘检测生成(伪)手绘线稿风格的视频简易版教程_第5张图片

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

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

你可能感兴趣的:(图像处理,音视频,python,计算机视觉)