Python字符串视频的生成笔记
Published in:2020-06-11 |

给一个完整的视频,对视频进行处理,达到:生成一个新的视频,用自己想要的字符串来代替视频中的原有元素。

字符串视频的生成

1
给一个完整的视频,对视频进行处理,达到:生成一个新的视频,用自己想要的字符串来代替视频中的原有元素。

思路

1
2
3
4
5
1. open-cv视频处理库
pip install opencv-python
2. 先把视频里面每一帧的图片都抽取出来
3. 把每一帧的图片都给处理成字符串组成的新图片
4. 新的图片给组合成一个新的视频。

读取视频

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# _*_coding:UTF-8 _*_
'''
1. open-cv视频处理库
pip install opencv-python
2. 先把视频里面每一帧的图片都抽取出来
3. 把每一帧的图片都给处理成字符串组成的新图片
4. 新的图片给组合成一个新的视频。
'''

# CV2不支持中文,任何中文路径都会报错
import cv2
# 打开一个视频流,方法中需要传一个参数,默认无参,表示打开摄像头。
vidcap = cv2.VideoCapture(r'G:\CV\video\video.avi')
# print(vidcap.read()) # .read()方法返回两个值:1.读取状态2. 视频里图片的元素 三通道图片RGB

success = True
# count为计数器,主要为了对图片进行排序
count = 0
while success:
# 读取视频的内容,返回读取状态和当前帧内容(当前帧是一个三通道的图片)
success,image = vidcap.read()
# print(success) 程序终止

# 把当前帧图片写入到文件夹中
cv2.imwrite(r'G:\CV\pic\%d.jpg'%count,image) #记录顺序,并命名%d.jpg
count += 1
# 一定会报错,会在最后一次,读取最后一帧,超过最后一帧的时候,会报错。

处理视频图片为字符串图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# _*_coding:UTF-8 _*_
from PIL import Image,ImageDraw,ImageFont
import os
import cv2
'''
Cpython基于C编写,GIL锁,目的是为了防止脏读
脏读:无效数据的读出,是指在数据库访问中,事务T1将某一值修改,
然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,
这就导致了T2所读取到的数据是无效的,值得注意的是,脏读一般是针对于update操作的。
'''
def draw(pic):
# 读取在上一个程序中保存下来的截图
# 有时候PIL和CV2他不支持反斜杠,需要将反斜杠换为斜杠
# 现在读出来的图片,虽然是三通道,但不是RGB,而是BGR
img = cv2.imread('G:\CV\strVideo\pic\%s'%pic)
# print(img)
# 把读出来的数据BGR换为RGB
# 读出来的每一张图片都是三维数据,[图片长,图片宽,通道值]
img = img[:,:,(2,1,0)] #切第三维,原本为BGR(0,1,2),需改为RGB(2,1,0)
# print(img)


# 创建一个新的空白画布,如果最后color值不传或者为None则默认为黑色填充
blank = Image.new("RGB",[len(img[0]),len(img)],"white")
# 创建一个新画布,可以在给定图像上进行绘图,需要给定要在哪个图像上进行绘图
drawOBJ = ImageDraw.Draw(blank)
n = 10
# 规定要使用的字体,并且规范字号
font = ImageFont.truetype(r'C:\Windows\Fonts\Microsoft YaHei UI\msyhbd.ttc',size=n-1)
# 需要遍历新图像的每个像素点
for i in range(0,len(img),n): #注意步长n
for j in range(0,len(img[i]),n):
text = '人智真棒'
#重新替换所有元素
drawOBJ.ink = img[i][j][0]+img[i][j][1] * 256 + img[i][j][2]*256*256
drawOBJ.text([j,i],text[int(j/n) % len(text)],font=font)
# 保存图片,第一个参数为路径,第二个参数为保存格式
print(i,j)
# 保存图片,第一个为路径,第二个为保存格式
blank.save('new/new_'+pic,'jpeg')


# 获取到传入路径下的所有文件名
filelist = os.listdir(r'G:\CV\strVideo\pic')
for file in filelist:
draw(file)
# print(filelist)

将新图片组成新的视频

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# _*_coding:UTF-8 _*_

import os
import cv2

# 排序
def resort(list):
for i in range(len(list)-1): #len(list)-1后面取不到
for j in range(len(list)-1):
# print(list[j+1].split('.')[0].split('_')[1]) 先用"."分,生成列表new_0,在用"_"分
# 冒泡排序 这里需要注意转成整型在比较,原来为字符串
# 字符串比较的时候是按位数比较
if int(list[j].split('.')[0].split('_')[1]) > int(list[j+1].split('.')[0].split('_')[1]):
list[j],list[j+1] = list[j+1],list[j]
return list


filelist = os.listdir(r'G:\CV\strVideo\new')
filelist = resort(filelist)
# fps=频率,指的是每秒钟显示多少张照片
fps = 24
# 图片的分辨率 高 × 宽

# 规定导出的文件名
file_path = r'G:\CV\strVideo\video\new_video.avi'
# 规定导出的格式
fourcc = cv2.VideoWriter_fourcc('I','4','2','0')# 规定视频流编码
# 不同视频编码对应不同视频格式(例:'I','4','2','0' 对应avi格式)
# fourcc = cv2.VideoWriter_fourcc('D', 'I', 'V', 'X') #mp4格式
# 创建写入视频对象,需要规范输出文件路径、编码格式、fps以及图片分辨率
# 相当于创建一个视频,但是该视频为空
# video = cv2.VideoWriter(file_path,fourcc,fps,size) size是相反的
video = cv2.VideoWriter(file_path,fourcc,fps,(960,540)) #需要特别注意分辨率问题
# 遍历图片往视频里面写
for item in filelist:
item = os.path.join(r'G:\CV\strVideo\new', item) #文件名和图片名拼接一起
# print(item) 显示拼接后的路径
# 读取图片内容
img = cv2.imread(item)
print(img)
# 相当于向视频中一帧一帧的添加图片
video.write(img)

video.release() #释放video资源
Prev:
线性回归和逻辑回归学习笔记
Next:
软件需求工程---数据流图