使用 cv2.videowriter 时如何处理文件名读取约定
How to deal with filename reading convention when using cv2.videowriter
基本上我有一个包含具有以下命名约定 frame{framenumber}.jpeg 的图像的目录。但是,当我实现以下旨在使用 cv2 包将这些图像拼接成视频的功能时,会出现这种意外行为,即按以下顺序读取文件:
['frame0.jpg', 'frame1.jpg', frame10.jpg', '100.jpg', '101.jpg', '102.jpg', '103.jpg ', 'frame104.jpg', 'frame105.jpg', 'frame106.jpg', 'frame107.jpg', 'frame108.jpg', 'frame109.jpg', 'frame11.jpg', 'frame110.jpg', ...]
所以它没有按时间顺序排列,看起来有点有趣,因为至少每 10 帧都来自视频的完全不同的片段。这个问题是否有一个明显的解决方案(一些更好的方式来读取我不知道的一些命名约定的图像)?
def makevideo():
img_array = []
filenames = []
for filename in glob.glob(r'D:\Uni work\Engineering Mathematics Work\MDM3\Mojo\mojo_sperm_tracking_data_bristol\tp49\*.jpg'):
img = cv2.imread(filename)
height, width, layers = img.shape
size = (width,height)
filenames.append(filename)
img_array.append(img)
print(filenames)
out = cv2.VideoWriter('project.avi',cv2.VideoWriter_fourcc(*'DIVX'), 60, size)
for i in range(len(img_array)):
out.write(img_array[i])
out.release()
提前致谢!
文件系统上的文件未排序。您需要使用 sorted() 函数自行对生成的文件名进行排序:
import re
numbers = re.compile(r'(\d+)')
def numericalSort(value):
parts = numbers.split(value)
parts[1::2] = map(int, parts[1::2])
return parts
for filename in sorted(glob.glob(r'D:\Uni work\Engineering Mathematics Work\MDM3\Mojo\mojo_sperm_tracking_data_bristol\tp49\*.jpg'), key=numericalSort):
基本上我有一个包含具有以下命名约定 frame{framenumber}.jpeg 的图像的目录。但是,当我实现以下旨在使用 cv2 包将这些图像拼接成视频的功能时,会出现这种意外行为,即按以下顺序读取文件: ['frame0.jpg', 'frame1.jpg', frame10.jpg', '100.jpg', '101.jpg', '102.jpg', '103.jpg ', 'frame104.jpg', 'frame105.jpg', 'frame106.jpg', 'frame107.jpg', 'frame108.jpg', 'frame109.jpg', 'frame11.jpg', 'frame110.jpg', ...] 所以它没有按时间顺序排列,看起来有点有趣,因为至少每 10 帧都来自视频的完全不同的片段。这个问题是否有一个明显的解决方案(一些更好的方式来读取我不知道的一些命名约定的图像)?
def makevideo():
img_array = []
filenames = []
for filename in glob.glob(r'D:\Uni work\Engineering Mathematics Work\MDM3\Mojo\mojo_sperm_tracking_data_bristol\tp49\*.jpg'):
img = cv2.imread(filename)
height, width, layers = img.shape
size = (width,height)
filenames.append(filename)
img_array.append(img)
print(filenames)
out = cv2.VideoWriter('project.avi',cv2.VideoWriter_fourcc(*'DIVX'), 60, size)
for i in range(len(img_array)):
out.write(img_array[i])
out.release()
提前致谢!
文件系统上的文件未排序。您需要使用 sorted() 函数自行对生成的文件名进行排序:
import re
numbers = re.compile(r'(\d+)')
def numericalSort(value):
parts = numbers.split(value)
parts[1::2] = map(int, parts[1::2])
return parts
for filename in sorted(glob.glob(r'D:\Uni work\Engineering Mathematics Work\MDM3\Mojo\mojo_sperm_tracking_data_bristol\tp49\*.jpg'), key=numericalSort):