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()

这个时候得到的视频顺序是正确的,时长也是正常的了。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐