目录
概述
本次小项目主要是使用一些opencv的基础操作实现,实现简单,娱乐为主,其可以读入一段视频然后生成线稿风格的视频。
主要技术
1,使用opencv逐帧读入和写出视频。
2,使用Canny进行边缘检测。
实现流程
1,设置一些文件名和颜色参数
path = "./videos"
paths = "./news"
if not os.path.exists(paths):
os.mkdir(paths)
line_color = (0, 0, 0) # 黑色
bg_color = (255, 255, 255) # 白色
number = 1 # 记录文件夹中视频的个数
2,遍历文件夹内的所有视频,将其打开并创建和其帧数,尺寸一样的视频模板
for dirs in os.listdir(path):
cap = cv2.VideoCapture(os.path.join(path, dirs)) # 获取视频
fps = cap.get(cv2.CAP_PROP_FPS) # 获取视频的帧率
_, frame = cap.read() # 先打开第一帧
size = (frame.shape[1], frame.shape[0]) # 从第一帧中获取图片尺寸
c = 1
videowrite = cv2.VideoWriter(r'./news/test%s.mp4' % number, -1, fps, size) # fps是帧数,size是图片尺寸
3,逐帧遍历视频并对每一帧图像进行边缘检测,再将检测后的图像更换背景和边缘,最后写出
print("开始读取第%s个视频!" % number)
while True:
ret, frame = cap.read() # ret是获取这一帧有没有图片,frame是获取图片
if ret:
print("开始截取视频第:" + str(c) + " 帧") # 这里就可以做一些操作了:显示截取的帧图片、保存截取帧到本地
img = cv2.Canny(frame, 50, 120) # 获取边缘
frame[img != 255] = bg_color # 将背景图设置为白色
frame[img == 255] = line_color # 将边缘(线条)设置为黑色
videowrite.write(frame) # 白线条,黑背景
# videowrite.write(img) # 黑线条,白背景
# cv2.imwrite(os.path.join(paths, "%05d" % c + '.jpg'), frames) # 这里是将截取的图像保存在本地
c += 1
else:
print("所有帧数都已读取完毕!")
break
number += 1
cap.release()
videowrite.release()
print('end!')
注意事项
1,本项目需要创建一个videos文件夹,将要转换的视频放到videos文件夹下,转换完之后将保存进news文件夹下
2,转换完之后的视频是没有声音的,由于声音的帧数和视频的帧数每秒频率可能不一样,所以可以自行提取音频后用剪辑软件合成
3,可以自行修改line_color和bg_color生成其他不同颜色的线条和背景的视频
源码请查看:https://github.com/jvyou/Lineart-style-video-generation
线稿成果视频请查看:https://www.bilibili.com/video/BV1FF4m1u7nP/?spm_id_from=333.999.0.0&vd_source=ea64b940c4e46744da2aa737dca8e183