1. 动机
最近在做“动态手势识别”,下载了一个公开数据集。这个数据集全部是‘.jpg’的图片,需要把它转换成视频。
从网上找了一段代码:Python+Opencv实现把图片转为视频
import os
import cv2
import numpy as np
path = './data/'
filelist = os.listdir(path)
fps = 24 # 视频每秒24帧
size = (176, 100) # 需要转为视频的图片的尺寸
video = cv2.VideoWriter("VideoTest1.avi",
cv2.VideoWriter_fourcc('I', '4', '2', '0'),
fps,
size)
# 视频保存在当前目录下
for item in filelist:
if item.endswith('.jpg'):
# 找到路径中所有后缀名为.png的文件,可以更换为.jpg或其它
item = path + item
img = cv2.imread(item)
video.write(img)
video.release()
cv2.destroyAllWindows()
2. 发现问题
但是发现生成的视频是乱序的。此时 print(os.listdir(path))
,输出结果如下:
3. 解决问题
根据 关于os.listdir函数“乱序”的解决方法 的代码,对于纯数字排序的图片,可以进行 sorted
使其顺序正确。
import os
img_sort = os.listdir('D:\Images\set12')
# get_key是sotred函数用来比较的元素,该处用lambda表达式替代函数。
get_key = lambda i : int(i.split('.')[0])
img_new_sort = sorted(img_sort, key=get_key)
print(img_sort, '\n', img_new_sort)
我们根据这两位老哥的讲解,得到:
import os
import cv2
path = './data/'
filelist = os.listdir(path)
filelist = sorted(filelist) # 使得list有序
fps = 24 # 视频每秒24帧
size = (176, 100) # 需要转为视频的图片的尺寸
# 可以使用cv2.resize()进行修改
video = cv2.VideoWriter("VideoTest1.avi", cv2.VideoWriter_fourcc('I', '4', '2', '0'), fps, size)
# 视频保存在当前目录下
for item in filelist:
if item.endswith('.jpg'):
# 找到路径中所有后缀名为.png的文件,可以更换为.jpg或其它
item = path + item
img = cv2.imread(item)
video.write(img)
video.release()
cv2.destroyAllWindows()
这个时候得到的视频顺序是正确的,时长也是正常的了。