我需要用python中的图像序列创建一个视频。我在网上发现这段代码运行良好,但在python中读取图像时,我遇到了一个小问题。尽管文件夹中的顺序是可以的。.,frame1000,frame1001,.当我在循环中使用python阅读它们时,在调试之后,我看到了以下内容:“frame1010 100.jpg”、“frame1010 1000.jpg”、“frame1010 1001.jpg”、“frame1010 1002.jpg”、.、frame101、frame1010、frame1011.
这是密码
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()
发布于 2019-11-14 01:47:18
您需要使用知道如何排序数字的自然排序来对文件名进行排序:
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)
发布于 2019-11-14 01:57:59
首先,文件夹中的文件没有在OS级别上以任何方式“排序”(至少在我所知道的最流行的操作系统中是如此)。如果您在某些文件浏览器中看到它们“有序”,那么它完全是由文件浏览器应用程序本身(finder//etc)完成的,但是python不使用它。
其次,如果您阅读了os.listdir的文档,就会清楚地指定文件是以任意顺序返回的。你应该自己点。
第三,您的文件名为零填充。这意味着,如果在字母顺序中对文件名进行排序(这是python中字符串的默认值),您将得到上面指定的顺序(frame101.jpg
,frame1010.jpg
)。如果它们是零填充,即使排序为字符串(frame0101.jpg
、frame0102.jpg
、.、frame1010.jpg
),也可以得到正确的顺序。
解决方案是从文件名中提取帧号,将其转换为整数,并根据该编号对文件名进行排序。实现这一目标的最简单方法是:
sorted_images = sorted(images, key=lambda x:int(x[5:-4]))
其中5是前缀frame
的长度,-4是.jpg
的长度,我希望从文件名中删除前缀和后缀。查看python切片和关键参数 of sorted
的文档以获得更多信息。
发布于 2019-11-14 01:54:33
您没有显式地对框架进行排序,而是依赖os.listdir
为您排序。这可能会导致问题,因为无法保证列表将按字母顺序排列。
参考资料:os.listdir()文档
返回一个列表,其中包含按路径给出的目录中条目的名称。列表的顺序是任意的。
解决方案1
在处理前显式地排序您的列表。
images = images.sort()
或
for image in images.sort():
然而,要做到这一点,您必须首先修改文件的名称,否则它将排序为100 > 1001 > 1002 . 101 > 1010,就像您描述的那样。要做到这一点,可以在小于1000的文件名之前添加一个零:
images = [img if len(img)==13 else img[:7] + "0" + img[-7:] for img in images]
解决方案2
如果您确信所有文件都是"frame + number + .jpg“格式的,那么您可以这样做:
images = ["frame" + str(i) + ".jpg" for i in range(100, 1234)] ## replace 1234 with (last frame number + 1)
https://stackoverflow.com/questions/58853388
复制相似问题