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)