05, Moviepy video.tools视频的相关工具api使用

1,744 阅读3分钟

1, credits1

credits1(creditfile,width,stretch = 30,color ='white',stroke_color ='black',stroke_width = 2,font ='Impact-Normal',fontsize = 60 )

参数 含义
creditfile 文本
width 显示的宽
stretch
color 文本颜色
stroke_color 外边框颜色
stroke_width 外边框的粗
font 字体
fontsize 字号

主要是将文本转换为图片imageclip, 可以设置文本的宽, 字体及文字颜色, 字号等等

code

# coding:utf8
import  cv2
from moviepy.editor import *
import numpy as np
from moviepy.video.tools.credits import  credits1


out = credits1(creditfile='./words.txt', width=720, stretch=10, color='white', stroke_color='red', stroke_width=2, font='../aiqingtuya/ss.ttf', fontsize=60)
fps = 10
speed = 10
out = out.set_start(0).set_duration(out.h/speed/fps).set_position(lambda t:(0, out.h-t*fps*10)).set_fps(10)
bg_arr = np.zeros((out.h, 720, 3))
bg = ImageClip(bg_arr).set_duration(out.h/speed/fps)

result = CompositeVideoClip([bg, out])
result.write_videofile('../demo/words.mp4')
#  输出gif
# result = result.set_fps(2)
# result.write_gif('./words.gif')

# 显示第一帧图片
# opencv 是BGR通道, moviepy是RGB通道
# frame = out.get_frame(0)
# out = cv2.cvtColor(frame,cv2.COLOR_RGB2BGR)
# cv2.imshow('not cvt', frame)
# cv2.imshow('cvt', out)
# cv2.waitKey(0)



2, Drawing

2.1 blit 图片合成

blit(im1, im2, pos=[0, 0], mask=None, ismask=False) 把图片1绘制到图片2上面,即使图片1比图片2大, 结果图片的尺寸依然为图片2的大小,图片1会被截断,导致显示不全

参数 含义
im1 图片1 (绘制在上面)
im2 图片2 (绘制在底层)
pos 图片1在图片2的位置, 左上角为(0, 0)
mask 遮罩层
ismask 是否有遮罩层
# coding:utf8
import  cv2
from moviepy.editor import *
import numpy as np
from moviepy.video.tools.drawing import *

from playutil import *
from moviepy.video.tools.credits import  credits1

im1 = cv2.imread('../demo/cat.jpg')
im1_resized = cv2.resize(im1, (200, 200))
im2 = cv2.imread('../demo/123.png')
out = blit(im1_resized, im2,(10,10))
print(out.shape)
cv2.imshow('',out)
cv2.waitKey(0)

2.2 circle 绘圆

circle(screensize, center, radius, col1=1.0, col2=0, blur=1)

参数 含义
screensize 画布大小
center 圆点点坐标
radius 圆心坐标
col1 圆内颜色
col2 圆外颜色
blur 有一圈混合色的圆环
out = circle((500, 500), center=(250,  250), radius=100, col1=(0, 0, 255), col2=(0,255,0), blur=20)
cv2.imshow('', out)
cv2.waitKey(0)

2.3 color_gradient

color_gradient(size, p1, p2=None, vector=None, r=None, col1=0, col2=1.0, shape='linear', offset=0)

参数 含义
size 输出图片的尺寸
p1 点1的坐标
p2 点2的坐标
vector 向量
col1 点1的颜色
col2 点2的颜色
shape linear, bilinear, or circular.
offset 偏移量, 大概在p1点的offset出开始出现颜色渐变
# coding:utf-8

import  cv2
from moviepy.editor import *
import numpy as np
from moviepy.video.tools.drawing import *

from playutil import *

out = color_gradient(size=(200, 200), p1=(0,0), p2=(200, 200), col1=(0,0,0), col2=(0,0,255), shape='linear',offset=0.1).astype('uint8')
cv2.rectangle(out, (10, 10), (20, 20), color=(255, 255, 255) ,thickness=2)
cv2.imshow('linear', out)

cv2.waitKey(0)

这边有点不太懂, 上面是p1, p2的官方文档注释 按理说p1(0,0)处应该是黑色, 但是实际上却是红色的, p1和p2处的颜色反过来了

2.4 color_split

color_split(size, x=None, y=None, p1=None, p2=None, vector=None, col1=0, col2=1.0, grad_width=0)

参数 含义
size 输出图片的尺寸
x 用一条垂直于x轴的线对图片进行分割
y 用一条垂直于y轴的线对图片进行分割
p1 点1的坐标
p2 点2的坐标
vector 向量
col1 第一部分的颜色
col2 第二部分的颜色
grad_width 分割线的宽, 中间会显示过度渐变
# coding:utf-8
import  cv2
from moviepy.editor import *
import numpy as np
from moviepy.video.tools.drawing import *

from playutil import *

out = color_split(size=(200, 200), x = 120, col1=(0,0,0), col2=(0,0,255), grad_width=10).astype('uint8')
cv2.imshow('linear', out)
cv2.waitKey(0)

3, Segmenting, Subtitles, Tracking

这几个就稍微说说吧, 做了好几个demo测试, 并没有看出很好的效果出来

segmenting.findObjects: 好像是会把图片的单独区域给找出来, 下代码早出了其中绘制的一个矩形

# coding:utf-8
import  cv2
from moviepy.editor import *
import numpy as np
from moviepy.video.tools.segmenting import *
from playutil import *

pic = np.zeros((800, 800, 3))
cv2.rectangle(pic, (100, 100), (200, 200), color=(255, 0, 0))
cv2.rectangle(pic, (400, 400), (500, 500), color=(0,0, 255))
clip = ImageClip(pic)
lists = findObjects(clip, 200)
for list in lists:
    frame = list.get_frame(0)
    cv2.imshow('',frame)
    cv2.waitKey(0)

Subtitles: 给视频添加字幕, 仅支持srt字幕文件

Tracking: 追踪

  • autoTrack 自动追踪
  • findAround 范围查找
  • manual_tracking 手动记录

会记录每一帧你鼠标点击的地方, 将其写入到文件中

# coding:utf-8
import  cv2
from moviepy.editor import *
import numpy as np
from moviepy.video.tools.tracking import *

from playutil import *

video = VideoFileClip('./result.mp4')
manual_tracking(video,fps=2, savefile='./xy.txt')

traj = Trajectory.load_list('./xy.txt')
print(traj)