首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在python中创建视频时保留图像的顺序?

如何在python中创建视频时保留图像的顺序?
EN

Stack Overflow用户
提问于 2019-11-14 01:28:31
回答 3查看 2.9K关注 0票数 1

我需要用python中的图像序列创建一个视频。我在网上发现这段代码运行良好,但在python中读取图像时,我遇到了一个小问题。尽管文件夹中的顺序是可以的。.,frame1000,frame1001,.当我在循环中使用python阅读它们时,在调试之后,我看到了以下内容:“frame1010 100.jpg”、“frame1010 1000.jpg”、“frame1010 1001.jpg”、“frame1010 1002.jpg”、.、frame101、frame1010、frame1011.

这是密码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def images_to_video():

image_folder = 'data_out'


images = [img for img in os.listdir(image_folder) if img.endswith(".jpg")]
frame = cv2.imread(os.path.join(image_folder, images[0]))
height, width, layers = frame.shape

video = cv2.VideoWriter('project.avi',cv2.VideoWriter_fourcc(*'DIVX'), 15, (width,height))


for image in images:
    video.write(cv2.imread(os.path.join(image_folder, image)))


cv2.destroyAllWindows()
video.release()
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-11-14 01:47:18

您需要使用知道如何排序数字的自然排序来对文件名进行排序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re

def natural_sort_key(s, _nsre=re.compile('([0-9]+)')):
    return [
        int(text)
        if text.isdigit() else text.lower()
        for text in _nsre.split(s)]

sorted_images = sorted(images, key=natural_sort_key)
票数 5
EN

Stack Overflow用户

发布于 2019-11-14 01:57:59

首先,文件夹中的文件没有在OS级别上以任何方式“排序”(至少在我所知道的最流行的操作系统中是如此)。如果您在某些文件浏览器中看到它们“有序”,那么它完全是由文件浏览器应用程序本身(finder//etc)完成的,但是python不使用它。

其次,如果您阅读了os.listdir的文档,就会清楚地指定文件是以任意顺序返回的。你应该自己点。

第三,您的文件名为零填充。这意味着,如果在字母顺序中对文件名进行排序(这是python中字符串的默认值),您将得到上面指定的顺序(frame101.jpgframe1010.jpg)。如果它们是零填充,即使排序为字符串(frame0101.jpgframe0102.jpg、.、frame1010.jpg),也可以得到正确的顺序。

解决方案是从文件名中提取帧号,将其转换为整数,并根据该编号对文件名进行排序。实现这一目标的最简单方法是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sorted_images = sorted(images, key=lambda x:int(x[5:-4]))

其中5是前缀frame的长度,-4是.jpg的长度,我希望从文件名中删除前缀和后缀。查看python切片关键参数 of sorted的文档以获得更多信息。

票数 2
EN

Stack Overflow用户

发布于 2019-11-14 01:54:33

您没有显式地对框架进行排序,而是依赖os.listdir为您排序。这可能会导致问题,因为无法保证列表将按字母顺序排列。

参考资料:os.listdir()文档

返回一个列表,其中包含按路径给出的目录中条目的名称。列表的顺序是任意的。

解决方案1

在处理前显式地排序您的列表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
images = images.sort()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for image in images.sort():

然而,要做到这一点,您必须首先修改文件的名称,否则它将排序为100 > 1001 > 1002 . 101 > 1010,就像您描述的那样。要做到这一点,可以在小于1000的文件名之前添加一个零:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
images = [img if len(img)==13 else img[:7] + "0" + img[-7:] for img in images]

解决方案2

如果您确信所有文件都是"frame + number + .jpg“格式的,那么您可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
images = ["frame" + str(i) + ".jpg" for i in range(100, 1234)] ## replace 1234 with (last frame number + 1)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58853388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文